选择使用案例显示所有结果

时间:2013-02-27 22:13:34

标签: sql sql-server

articles中的两个字段:

titlebody

两条记录:

meow bark | 1234 5678bird 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

我略微修改了它,但没有想到足以打破它。

3 个答案:

答案 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

最终编辑

Try this fiddle

如果小提琴过时,这里是剧本:

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过滤它们