【问题标题】:SQL Text Search - EXACT before space, LIKE after in search termSQL 文本搜索 - EXACT 在空格之前,LIKE 在搜索词之后
【发布时间】:2014-11-27 11:02:50
【问题描述】:

我正在尝试创建一个 SQL 查询,该查询将为文本字段的自动完成提供值。一切正常,但是我似乎无法创建一个足以满足我想要的目的的 SQL 查询。我正在使用 MySQL。

如果搜索词中有空格(或多个空格),我只希望查询对最后一个空格之后的字符串部分进行LIKE比较。

例如,假设我在数据库中有两个可能的值:

  • 螺栓
  • 大螺栓

目前,如果用户键入“Bolt”然后是空格,则使用此查询返回以上两个值 -

SELECT name FROM items WHERE name LIKE 'SEARCH_TERM%'

我想要的是,如果用户键入“Bolt”然后输入一个空格,那么数据库中只会返回 Bolt。

实际上意味着只使用 LIKE 比较空格之后的搜索词的最后一部分,结果应该完全匹配,直到最后一个空格。

我也试过了:

SELECT name FROM items WHERE name LIKE 'SEARCH_TERM[a-z]%'

但实际上使用上述方案不会返回任何结果。

我所追求的可能吗?我也尝试过使用全文搜索进行探索,但对此一无所知。我相信在名称字段上启用了全文搜索,但是我对此的经验有限。下面的查询无效。

SELECT name FROM items WHERE MATCH(name) AGAINST('SEARCH_TERM')

任何建议或意见将不胜感激。

【问题讨论】:

  • 什么版本的sql server?
  • MySQL 版本 5.6.21
  • 两个记录都返回了?那一定不是。它应该返回 no 记录,因为“Bolt”和“Bolts Large”都不匹配“Bolt %”。你确定吗?见sqlfiddle.com/#!2/623f73/1。它按预期工作。
  • 是的,我确定 - 请注意我的查询有 'Bolt%' 而不是 'Bolt%'
  • 什么?你说他们输入 Bolt,然后输入一个空格。那么空间突然在哪里?

标签: mysql sql


【解决方案1】:

查询

SELECT name FROM items WHERE name LIKE 'Bolt %'

不返回任何记录,因为“Bolt”和“Bolts Large”都不匹配“Bolt %”。

SELECT name FROM items WHERE name LIKE 'Bolt%'

返回两条记录,因为“Bolt”和“Bolts Large”都匹配“Bolt%”。

要查找“Bolt”而不是“Bolts”,您必须在搜索字符串和列字符串中都添加一个空格:

 SELECT name FROM items WHERE concat(name, ' ') LIKE 'Bolt %'

返回“螺栓”,但不返回“大螺栓”。

【讨论】:

  • 太棒了,完美运行。您介意快速解释一下为什么需要在列字符串中添加空格吗?
  • 您正在寻找字符串“Bolt”。这不是“螺栓”的子字符串。您会找到“Bolt Large”和“Bolt Small”,但没有找到“Bolt”,因为“Bolt”后面没有空格。添加空格时,您还会找到单个“螺栓”。
  • 太棒了。感谢您的帮助。
【解决方案2】:
SELECT name FROM items WHERE REPLACE(name, ' ', '') LIKE 'SEARCH_TERM%'

【讨论】:

  • 感谢您的建议。我很快就有了这个测试。
  • 感谢您的帮助 - 尽管根据上面的 cmets 应该不需要。
【解决方案3】:

你也可以使用 CONCAT 和 TRIM,或者只是修剪

SELECT name FROM items WHERE name LIKE TRIM('SEARCH_TERM')

or your choice

SELECT name FROM items WHERE name LIKE CONCAT(TRIM('SEARCH_TERM'), '%')
SELECT name FROM items WHERE name LIKE CONCAT('%',TRIM('SEARCH_TERM'))
SELECT name FROM items WHERE name LIKE CONCAT('%',TRIM('SEARCH_TERM'), '%')

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 2021-06-12
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多