0

表中的两个字段articles

titlebody

两条记录:

meow bark | 1234 5678bird snake | 8596 2952

Where meow barkis undertitle1234 5678is underbody等...

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 是如何工作的,否则如果上面示例中的标题与 meow 或 bark 匹配,它应该显示 - 否则,不显示。

目标是根据大多数匹配返回结果。看看这里的小提琴:http ://sqlfiddle.com/#!3/13b33/10

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

4

3 回答 3

3

如果要排除行,则需要将其放在 WHERE 子句而不是 SELECT 子句中。

此外,您使用的比较是equivalence。如果该列包含您的搜索值,这将不会“匹配”,正如您似乎认为的那样,但前提是该列具有完全相同的文本并且没有其他内容(有一些小的整理余量)。

于 2013-02-27T22:16:56.513 回答
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;
于 2013-02-27T22:19:12.657 回答
0

您没有在查询中提到 where 子句,它将获取所有记录,除非您使用 where 条件过滤它们

于 2013-02-27T22:22:43.737 回答