在列搜索查询的CASE语句中包含OR - SQL

时间:2017-01-06 18:53:52

标签: sql sql-server

目标:

如果filterFeatures等于" lite"然后搜索:

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

或者,如果filterFeatures等于" professional"然后搜索:

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'。

附近的语法不正确

如果问题需要更具体,请告诉我。

3 个答案:

答案 0 :(得分:1)

您的CASE表达式看起来不对。如果过滤条件作为参数传递;说@filter然后它应该看起来像

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

答案 1 :(得分:1)

实施复合条件时,无法像这样构建CASE。您可以从不THEN子句中添加条件。你需要在每个WHEN之后写出完整的条件。

换句话说,你不能这样做:

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

相反,你必须这样做:

CASE 
  WHEN @a=@b OR @a=@c THEN ...

在你的情况下,你实际上是在寻找这样的逻辑:

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

根本不需要CASE表达式。

答案 2 :(得分: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))
)