SQL SELECT LIKE 只包含特定的词

标签 sql select sql-like

我有这个问题:

SELECT * FROM mytable
WHERE column1 LIKE '%word1%'
AND column1 LIKE '%word2%'
AND column1 LIKE '%word3%'

我需要修改此查询以返回 column1 包含 word1 word2 和 word3 而没有其他内容的记录!没有别的词,只有这些词。

示例:搜索 samsung galaxy s3 应该返回 samsung s3 galaxy 的任意组合,但不是 samsung galaxy s3 lte

最佳答案

假设 column1 包含空格分隔的词,而您只想匹配整个 词,例如:

SELECT * FROM
  (select ' ' + REPLACE(column1,' ','  ') + ' ' as column1 from mytable) t
WHERE
   column1 like '% word1 %' AND
   column1 like '% word2 %' AND
   column1 like '% word3 %' AND
   REPLACE(REPLACE(REPLACE(column1,
      ' word1 ',''),
      ' word2 ',''),
      ' word3 ','') = ''

请注意,此结构确实允许相同 词出现多次。从问题中不清楚是否应该允许这样做。 ( Fiddle )


如果这些词作为单独的行存储在与 mytable 相关的单独表中,那将是一个更好的设计。然后我们可以使用更正常的 SQL 来满足这个查询。您的示例看起来像是某种标记示例。用一个表将每个标签存储为单独的行(如果需要,还记录序号位置)会将其变成一个简单的关系除法问题。


一种计算单词在列中出现次数的方法是表达式:

(LEN(column2) - LEN(REPLACE(column2,'word',''))/LEN('word')

但这将再次恢复到匹配较大单词的子序列以及单词本身,而无需更多工作。

关于SQL SELECT LIKE 只包含特定的词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291060/

相关文章:

mysql - 如何仅当单独表中的 SUM(字段) > 0 时才使用 MAX 来选择记录来识别最新的 'field'

mysql - 是否可以将根据条件计算的值插入到 mysql 中?

MySQL 在一次查询中获取 mindate 和 maxdate

orm - 在 Laravel 中使用 Eloquent ORM 使用 LIKE 执行数据库搜索

Mysql:WHERE LIKE条件中按优先级排序

sql - Access 数据库,通过最大问题选择组

sql - 使用SQL计算GPA,报 "Invalid Identifier"错误

mysql - 执行数学函数作为默认值 MySQL

sql - "WHERE X > ALL SELECT MAX"与 "WHERE X > SELECT MAX"

sql,找出字符串包含某些文本的策略