2013-02-27 45 views
0

表中的articles两个字段:选择使用情况显示所有结果

titlebody

两个记录:

meow bark | 1234 5678bird snake | 8596 2952

meow barktitle1234 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

好吧 - 这就是发生了什么,但你要返回什么? – whytheq 2013-02-27 22:15:26

+0

我的歉意,我已经在标题栏中更新了 – 2013-02-27 22:19:13

+0

这个问题,它实际上是说'喵吠'还是说'喵'**或**'树皮'? – whytheq 2013-02-27 22:24:28

回答

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; 
+0

+1,但你仍然需要第二个查询中的匹配表达式为了ORDER BY。 – 2013-02-27 22:39:31

+0

@AaronBertrand - 我添加了一个小提琴的链接 - 我现在要修改它 – whytheq 2013-02-27 22:45:32

3

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

此外,您正在使用的比较为等同于。如果列中包含您的搜索值,则这不会“匹配”,正如您似乎认为的那样,但仅当列具有完全相同的文本并且没有其他内容时(具有一些小的排序余量)。

+0

+1就像那样简单 – whytheq 2013-02-27 22:23:16

0

你没有在那里查询提到的条款,这将获取所有记录,除非你使用条件筛选它们