2013-07-10 95 views
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 UNION ALL語句的所有查詢同一個表。我想知道是否有更簡單/更快捷的方式來做事情。

+3

使用case語句... –

+0

我們在這裏測試多少列或僅僅是列2和3? – maSTAShuFu

+0

@RhianA,有六列 – user194076

回答

4

是的,你可以用case語句這樣

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 

編輯重寫它:好了,因爲根據您的意見,也有我們需要解決兩個問題我想提出這個編輯。 (我將離開原來的答案,因爲它可以幫助某人。)

1)結果集應該被過濾,並且不應該有else部分。

這實際上可以通過此解決方案實現,因爲else是可選的,數據可以使用最後的where子句過濾。

2)如果匹配條件,可以多次使用不同的Testing #值來選擇相同的行。

然而,這是我以前的解決方案無法實現的。所以我想到了另一個。希望它適合你的情況。這裏是

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> 

我認爲這應該工作,併產生你想要的結果。但由於我沒有這些數據,我無法運行基於工會的解決方案的任何基準。所以我沒有任何科學證據表明這個速度更快,但它是一種選擇。你可以測試兩者並使用更好的。

它可能有點晚,但希望這可以解決您的問題。

+0

謝謝你提供一個很好的建議。儘管我發現這個解決方案有幾個問題。 1.沒有「測試#3」。我的意思是這個查詢返回MyTable中的所有記錄,但我只需要符合條件的行,應該沒有「else」。 2.無法兩次選擇相同的行。假設我的行適合多個條件,那麼我只想用不同的'Testing#'標籤多次選擇它,但當前的解決方案只會選擇第一個匹配 – user194076

+0

@ user194076:因此創建多個列,每個列都帶有一個case語句。除此之外,沒有魔法解決方案 –

+0

@MitchWheat,好的。一般來說,你知道哪一個表現會更好嗎?一個將創建多個列,然後將它們合併到一個列中,或使用UNION ALL的解決方案? – user194076

0

您可以在一個聲明中做到這一點,但你要爲每個測試不同的列:

select column1, 
     (case when column2 is not null and column3 = 'Value' then 1 else 0 
     end) as Test1 
     (case when column3 is null and column3 = 'Test Value' then 1 else 0 
     end) as Test2, 
     . . . 
from t; 

因爲你只需要在事情失敗的情況下,你可以把它放進一個子查詢和測試的任何失敗:

select * 
from (select column1, 
      (case when column2 is not null and column3 = 'Value' then 1 else 0 
       end) as Test1 
      (case when column3 is null and column3 = 'Test Value' then 1 else 0 
       end) as Test2, 
      . . . 
     from t 
    ) t 
where test1 + test2 + . . . > 0 
+0

謝謝你的代碼,但它沒有按預期工作。我不需要選擇多個列。我只需要根據滿足的條件有一列帶有不同標籤('測試#1','測試#2'等)。一行可以滿足多種條件。 – user194076

+0

@ user194076。 。 。如果你想了解潛在的邏輯,我建議你單獨看所有的條件。無論如何,frkn的解決方案將所有內容放到一個列中。 –

相關問題