2017-01-06 66 views
0

的目的:包括或CASE語句欄搜索查詢中 - SQL

如果filterFeatures等於「精簡版」,然後搜索此:

FeatureString LIKE '%" + lite + @"%' OR FeatureString LIKE '%" + bronze + @"%' 

或者,如果filterFeatures等於「專業」,然後搜索此:

FeatureString LIKE '%" + professional + @"%' OR FeatureString LIKE '%" + gold + @"%' 

我的想法是使用CASE語句,但可能有更好的解決方案?

FeatureString是列名。

filterFeatures是在FeatureString列中搜索的字符串。

'%" + bronze + @"%','%" + lite+ @"%','%" + professional+ @"%'是定義的字符串。

如果我把OR語句,然後它的作品。但是,如果「filterfeatures」等於liteprofessional,則目標是搜索兩個參數。


當前查詢:

SELECT * 
FROM[database] 
WHERE 
(
(FeatureString LIKE 
CASE '%" + filterFeatures + @"%' 
WHEN 
('%" + lite + @"%') 
THEN 
('%" + lite + @"%' OR FeatureString LIKE '%" + bronze + @"%') 
WHEN 
('%" + professional + @"%') 
THEN 
('%" + professional + @"%' OR FeatureString LIKE '%" + gold + @"%') 
ELSE 
('%" + filterFeatures + @"%') 
END) 
) 

錯誤消息:關鍵字 'OR' 鄰近

不正確的語法。

請讓我知道如果問題需要更具體。

回答

1

您的CASE表達式看起來不正確。如果過濾條件作爲參數傳遞;說@filter那麼它應該看起來像

CASE WHEN @filter = 'lite' THEN FeatureString LIKE '%lite%' 
+0

你可以讓它使用OR語句嗎?因爲我們需要搜索two.THEN FeatureString LIKE'%lite%'或FeatureString LIKE'%bronze%' – Ophiucus

1

你不能構建你的情況是這樣,當你實現複合條件。並且您可以從從不條款THEN條款。您需要在每個WHEN後寫完整條件。

換句話說,你不能做到這一點:

CASE @a 
    WHEN @b or @c THEN ... 

相反,你必須這樣做:

CASE 
    WHEN @[email protected] OR @[email protected] THEN ... 

在你的情況,你實際上是在尋找這樣的邏輯:

WHERE (@a='foo' AND (@b LIKE 'bar' OR @b LIKE 'bur')) 
OR ... 

根本不需要CASE表達式。

+0

我看不到這是如何工作的。如果featurestring是精簡的,那麼sql需要搜索lite或FeatureString LIKE銅牌。另一方面,如果featurestring是專業的,那麼sql需要搜索專業和黃金。 – Ophiucus

+0

重新閱讀您問題中的第一段(「目標」)。看看我最後的邏輯例子。提供「filterFeature」來代替'@ a',並提供「FeatureString」來代替'@ b',這正是你說你想要的邏輯。 –

0

這是一個有效的解決方案,但它不是很優雅。

SELECT * 
FROM[database] 
WHERE 
((FeatureString LIKE 
           (CASE '%" + filterFeatures + @"%' 
            WHEN 
             ('%" + lite + @"%') 
            THEN 
             ('%" + lite + @"%') 
            WHEN 
             ('%" + professional + @"%') 
            THEN 
             ('%" + professional + @"%') 
            ELSE 
             ('%" + filterFeatures + @"%') 
           END) 
           OR FeatureString LIKE 
           (CASE '%" + filterFeatures + @"%' 
            WHEN 
             ('%" + lite + @"%') 
            THEN 
             ('%" + bronze + @"%') 
            WHEN 
             ('%" + professional + @"%') 
            THEN 
             ('%" + gold + @"%') 
            ELSE 
             ('%" + filterFeatures + @"%') 
           END)) 
)