目标:
如果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"等于lite
或professional
。
当前查询:
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'。
附近的语法不正确
如果问题需要更具体,请告诉我。
答案 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))
)