我有一个问题:

SELECT *
FROM Items
WHERE column LIKE '%foo%'
   OR column LIKE '%bar%'

我该如何订购结果?

假设我有匹配'foo'的行和匹配'bar'的行,但我也有一行'foobar'。

如何订购返回的行,以便第一个结果是匹配更多LIKE的结果?

===============>>#1 票数:4

大小写或RDBMS支持的条件构造是一种方法

select *, case when col like '%foo%' and col like '%bar%' then 2 end 
else 1 end as ordcol 
from items 
where col like '%foo%' or col like '%bar%' order by ordcol

===============>>#2 票数:2

SELECT * FROM Items WHERE column LIKE '%foo%' OR column LIKE '%bar%' 
ORDER BY 
(IF(column LIKE '%foo%',1,0) + IF(column LIKE '%bar%',1,0)) 
DESC

if的语法是

IF ( condition, true_value, false_value )

===============>>#3 票数:1

您可以使用UNION

SELECT * FROM Items WHERE column LIKE '%foo%' AND column LIKE '%bar%'
UNION
SELECT * FROM Items WHERE column LIKE '%foo%' AND NOT (column LIKE '%bar%')
UNION
SELECT * FROM Items WHERE column LIKE '%bar%' AND NOT (column LIKE '%foo%');

但这可能是表现不佳的。 更糟糕的是,我猜你想用它来构建一个首先给出最有意义的结果的搜索引擎,然后单词的数量不会限制为2。

在这种情况下,您可以创建一个包含匹配数的score列。 像这样的东西:

SELECT
    *,
    (IF(column LIKE '%bar%', 1, 0) + IF(column LIKE '%foo%', 1, 0)) AS score
FROM Items
WHERE column LIKE '%foo%' OR column LIKE '%bar%'
ORDER BY score DESC;

我的SQL有点生疏,但至少在MySQL 5.0中应该是这样的。 另请参阅IF函数手册: http//dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

===============>>#4 票数:1

SELECT * FROM Items
WHERE col LIKE '%foo%'
    OR col LIKE '%bar%'
ORDER BY CASE WHEN col LIKE '%foo%' THEN 1
                WHEN col LIKE '%bar%' THEN 2
            END

===============>>#5 票数:0

哪个DBMS?

例如,它可以通过CTE或Union完成,但如果您使用的是MySQL,那么您可以忘记它。

===============>>#6 票数:0

试试这段代码:

SELECT * FROM Items WHERE column LIKE '%foo%' OR column LIKE '%bar%'
order by (select count(*) from items i where i.column= item.column) DESC 

如果您不关心细节,也可以按columncount(*)然后按ORDER分组。

===============>>#7 票数:0

你可能想要这样做:

SELECT *
FROM Items
WHERE column LIKE '%foo%' OR column LIKE '%bar%'
ORDER BY CASE WHEN column LIKE '%foo%' AND column LIKE '%bar%' THEN 1 ELSE 0 END DESC

注意:这是干编码的,可能不太便携。

===============>>#8 票数:0

2查询:

SELECT * FROM Items WHERE column LIKE '%foo%' AND column LIKE '%bar%';
SELECT * FROM Items WHERE (column LIKE '%foo%' AND column NOT LIKE '%bar%') OR (column NOT LIKE '%foo%' AND LIKE '%bar%')

(SQL中没有XOR)

===============>>#9 票数:0

并非所有RDBMS都支持IF(或Oracle中的DECODE)语句。 如果不是,您可以使用子查询来定义表“a”并搜索所有员工的名为JO SMITH或组合。

SELECT 
 a.employee_id,
 a.surname,
 sum(a.counter)
FROM

 (SELECT
   employee_id,
   surname,
   1 as counter
  FROM
   MyTable
  WHERE
   surname like '%SMITH%'

  UNION ALL

  SELECT
   employee_id,
   surname,
   1 as counter
  FROM
   MyTable
  WHERE
   surname like '%JO%'
   ) a

GROUP BY 
 a.employee_id,
 a.surname
ORDER BY 3,1,2

确保使用UNION ALL,否则它将无效。 您也可以使用UPPER()来使您的搜索不区分大小写。

===============>>#10 票数:0

由于您当前正在编写查询,因此WHERE子句不会为您提供可用于对结果进行排序的任何信息。 我喜欢Brian的想法 ; 添加一个常量列和UNION查询,你甚至可以在一个结果集中获取所有内容。 例如:

SELECT 1 as rank, * FROM Items WHERE column LIKE '%foo%' AND column LIKE '%bar%'
UNION
SELECT 2 as rank, * FROM Items WHERE column LIKE '%foo%' AND column NOT LIKE '%bar%'
UNION
SELECT 2 as rank, * FROM Items WHERE column LIKE '%bar%' AND column NOT LIKE '%foo%'
ORDER BY rank

但是,这只会给你这样的东西:

  • 与foo和匹配栏匹配的所有行的无序集合
  • 后跟(无序集合)所有与foo或bar匹配的行,但不是两者(尽管您可以在最后一个SELECT语句中使用不同的常量将其分解为两个单独的组)。

这可能正是您正在寻找的,但它不会告诉您哪些行与foo匹配三次,或者在仅包含一个foo实例的行之前对它们进行排序。 所有那些喜欢的东西也会变得昂贵。 如果您真正想要做的是根据相关性对结果进行排序(无论您如何定义),最好使用全文索引。 如果您正在使用MS SQL Server,它有一个内置服务可以执行此操作,还有第三方产品也会这样做。

编辑:看了所有其他的答案(当我开始我的时候只有两个答案 - 我显然必须学会更快地思考;-))很明显,有几种方法可以解决这个问题,具体取决于你想要完成什么。 我建议您根据它们在系统上的表现来测试和比较解决方案。 我不是一个性能/调优专家,但是函数往往会减慢速度,特别是如果你对函数的结果进行排序的话。 LIKE运算符也不一定是spry。 作为开发人员,使用熟悉的结构(如“IF”和“CASE”)似乎很自然,但使用更多基于集合的方法的查询通常在RDMS中具有更好的性能。 再次,YMMV,所以最好测试你是否完全关注性能。

  ask by translate from so

未解决问题?本站智能推荐:

1回复

SQL全文本搜索与LIKE搜索性能

我一直在互联网上搜索,发现全文搜索通常具有更好的性能。 我按照这篇文章中的说明在机器上设置了同义词库表,这样我就可以尝试使用它,并对全文本搜索更加熟悉。 我正在查看Microsoft SQL Server Management Studio 2008中的所有内容。 当我运行查询
3回复

SQL在表的所有列中搜索文本值

我有一个包含许多列的巨大表,并且我知道该列有时带有一些特定的值'MyValue'。 如何在一个包含“ MyValue”的特定表中选择所有行,而不管在哪一列中。 我在这里找到相关主题: 如何在SQL Server数据库的任何位置找到值? 但是我的查询需要一个较小的大炮。 我知道表名
4回复

用SQL搜索

我想使用PHP和SQL进行良好的搜索。 我正在考虑使用SQL的运算符LIKE(例如: SELECT * FROM Customers WHERE Country LIKE '%land% '),但我希望要显示的第一个元素是以“ land”开头的元素。 我怎样才能做到这一点? 我不想对数据库
2回复

改进我的sql查询,以便在表的所有列中搜索文本

我必须实现该功能,即用户在搜索字段中输入一些文本,并且需要从表中查询并拉出与该文本相关的项目。在表中,我有近8列面向用户和4列只要通过前端插入就会自动插入。 下面是我编写的查询,它可以通过mysql客户端运行, 现在由于某种原因,这个查询对我来说有点奇怪,因为我正在检查每个列的值,
3回复

你可以使用SQL Server自由文本搜索XML文件吗?

我有一份简历的XML提要。 简历的每个部分都分解为其组成部分。 例如<employment_history> , <education> , <skills> 。 我知道我可以将XML文件的每个部分保存到数据库中。 例如columnID = emp
1回复

使用关键字列和变量作为要搜索的文本来优化SQL搜索

这是我的难题。 我有一个包含一段文本的变量,并且有一列充满关键字的列。 我想针对变量中包含的整个文本搜索列中包含的每个关键字。 我知道如何执行此操作的唯一方法是一次选择该列的每一行,然后将LIKE运算符与两边的通配符一起使用,以查看是否在该列中的文本中的任何位置都找到了该列的关键字。变
2回复

返回在全文搜索SQL 2005中找到的短语的周围文本

我正在使用包含谓词来查找SQL Server索引文本字段中的短语。 有没有办法返回包含搜索短语的文本字段部分或其周围的某些区域? 例如,如果我在葛底斯堡地址(摘录如下)中搜索“所有男人都是平等的”,我想回到“致力于所有人都被创造平等的主张”,例如围绕它的一些文字。
6回复

如何在SQL数据库中搜索所有存储过程的文本

在Visual Studio 2k8中,我按Ctrl-F然后键入我要在项目中搜索的一些文本。 我可以一次快速搜索多个文件。 我有一个SQL Server与一些存储过程。 如何轻松搜索存储过程中的任意字符串? 我知道我可以在SQL Server Studio中列出一个存储过程的文本并从
4回复

需要在Teradata SQL中针对单词列表搜索文本字段并返回该单词

我正在大型数据库中搜索长度在5到7个字符之间的单词列表。 到目前为止,我有: 我也想返回在查询中找到的单词,但是在不复制subtr函数中单词列表的情况下,如何执行此操作仍然很困难。 这样做可能有更好的方法,我希望能有一些指导。
1回复

如何为QSQLite构建单个sql查询,以便在表上进行文本搜索

我在Qt 4.8中使用QSQLite并尝试进行全文搜索 我试图找到建立使用LIKE和%str%进行文本搜索的查询 或者其他查询。 我有N列的表,我喜欢建立查询,所以如果我搜索“foo” 它会给我作为结果,其中一行行中的部分或全部字符串包含“foo”的所有行。 在SQLite中执