1

以下を書き換えるより良い方法はありますか?

SELECT DISTINCT Column1, 'Testing #1' 
FROM MyTable
WHERE Column2 IS NOT NULL && Column3='Value'
UNION ALL
SELECT DISTINCT Column1, 'Testing #2'
FROM MyTable
WHERE Column3 IS NULL && Column2='Test Value'
UNION ALL
SELECT DISTINCT Column1, 'Testing #3'
FROM MyTable
Where ....

すべてが同じテーブルを照会する約 35 のユニオンすべてのステートメントがあります。物事を行うためのより簡単で高速な方法があるかどうか疑問に思っていました。

4

2 に答える 2

4

はい、このようなケースステートメントで書き直すことができます

SELECT Column1,
CASE WHEN Column2 IS NOT NULL AND Column3='Value' THEN 'Testing #1'
     WHEN Column3 IS NULL AND Column2='Test Value' THEN 'Testing #2'
     ELSE 'Testing #3' END as customcol
FROM MyTable

編集:あなたのコメントによると、対処する必要がある2つの問題があるため、この編集を行っています。(誰かを助けるかもしれない場合に備えて、元の回答をそのままにしておきます。)

1) 結果セットをフィルタリングする必要があり、パーツがない必要がありelseます。

elseこれはオプションであり、最後に where 句を使用してデータをフィルタリングできるため、このソリューションで実際に達成可能です。

Testing #2)基準に一致する場合、同じ行を異なる値で複数回選択できること。

ただし、これは以前のソリューションでは達成できません。そこで、別のものを考えました。それがあなたのケースに収まることを願っています。ここにあります

S1 -Testing #値 ( Testing #1、など)Testing #2を含む新しいテーブルを作成しますTesting #3。このテーブルの名前がTesting.

S2 - メイン テーブル ( MyTable) を、値Testingを含むテーブルと結合しますTesting #。これで、実際のデータとテスト値のすべての可能な組み合わせが得られました。

S3 - 表示したくない結果を where 句でフィルタリングします。

S4 - where 句に追加して、実データ <-> テストの組み合わせをフィルター処理します。

終了クエリは次のようになります。

SELECT M.Column1, T.TestingValue
FROM MyTable M
INNER JOIN Testing T ON 1=1
WHERE 
(
    (M.Column2 IS NOT NULL AND M.Column3='Value' AND T.TestingValue='Testing #1') OR
    (M.Column3 IS NULL AND M.Column2='Test Value' AND T.TestingValue='Testing #2') OR
    <conditions for other testing values>
)
AND
<other conditions>

これが機能し、必要な結果が得られるはずです。しかし、私はデータを持っていないので、ユニオンベースのソリューションに対してベンチマークを実行することはできません. したがって、これがより高速であると主張する科学的証拠はありませんが、オプションです。両方をテストして、より良い方を使用できます。

少し遅いかもしれませんが、これで問題が解決することを願っています。

于 2013-07-10T00:30:23.780 に答える