表articles
中的两个字段:
title
和body
两条记录:
meow bark | 1234 5678
和bird snake | 8596 2952
meow bark
位于title
下且1234 5678
位于body
之下,等等......
SQL查询:
SELECT *,
CASE WHEN title = 'meow' then 1 else 0 end + CASE WHEN title = 'bark' then 1 else 0 end AS matches
FROM articles
ORDER BY matches DESC
返回两行。请帮助我理解我的语法有什么问题。我希望它只返回标题与查询中匹配的行。除非我不理解CASE如何工作,如果上面例子中的标题与喵喵或树皮匹配,它应该显示 - 否则,不显示。
目标是根据大多数匹配返回结果。在这里看一下小提琴:http://sqlfiddle.com/#!3/13b33/10
我略微修改了它,但没有想到足以打破它。
答案 0 :(得分:3)
如果要排除行,则需要将其放在WHERE子句而不是SELECT子句中。
此外,您使用的比较是等效。如果列包含您的搜索值,这将不会“匹配”,如您所想,但仅当列具有完全相同的文本而没有其他(具有一些小的排序规则)时。< / p>
答案 1 :(得分:3)
不确定您想要达到的目标...您想要返回什么
这可能会更接近你想要的东西
SELECT *,
matches = CASE WHEN title LIKE '%meow5' THEN 1 ELSE 0 END + CASE WHEN title LIKE '%bark5' THEN 1 ELSE 0 END
FROM articles
ORDER BY matches desc
OP更新后编辑
如果您只想要返回一些记录,请尝试使用WHERE
子句:
SELECT *
FROM articles
WHERE title LIKE '%meow%'
OR
title LIKE '%bark%'
ORDER BY matches desc
最终编辑
如果小提琴过时,这里是剧本:
CREATE TABLE YourTable (FieldToSearch varchar(max));
INSERT INTO YourTable
VALUES
('If there were a dog'),
('If there was a dog'),
('If that dog died!'),
('I''d be happy with cat');
SELECT x.*
FROM (
SELECT FieldToSearch,
CASE WHEN ' ' + FieldToSearch + ' ' like '% if %' then 1 else 0 end
+ CASE WHEN ' ' + FieldToSearch + ' ' like '% there %' then 1 else 0 end
+ CASE WHEN ' ' + FieldToSearch + ' ' like '% was %' then 1 else 0 end
+ CASE WHEN ' ' + FieldToSearch + ' ' like '% a %' then 1 else 0 end
+ CASE WHEN ' ' + FieldToSearch + ' ' like '% dog %' then 1 else 0 end AS matches
FROM YourTable
)x
WHERE x.matches >0
ORDER BY x.matches DESC;
答案 2 :(得分:0)
你没有在查询中提到的where子句,它将获取所有记录,除非你使用where condition过滤它们