【问题标题】:SQL search with like, and cut result by spaces用like进行SQL搜索,并用空格剪切结果
【发布时间】:2015-07-10 14:35:27
【问题描述】:

假设我有下表:

ID      城市
1        纽约
2        伦敦
3        约克郡
4        西约克郡
5        北约克郡
6        纽约市

我如何从这个表(id 1,3,4,5)中获取每一行,其中包含一个以 York 开头的单词?

我们可以放心地假设每个单词都由一个空格分隔

如果我这样做了

 SELECT * FROM table WHERE City LIKE '%York%'

id 为 6 的行也被返回。

【问题讨论】:

  • 这个有点不清楚。您只想返回“约克郡”吗?
  • 当然第 6 行也匹配。为什么不应该呢?
  • 不,我想获取每行,其中 City 字段有一个单词,以 York 开头,因此 id 为 1,3,4,5 的行
  • 是的,但这不是您编码的内容。请参阅下面的答案,它解释了...
  • 他的意思是最后一行的 6 (Downyork)。

标签: mysql


【解决方案1】:
SELECT * FROM table WHERE City LIKE '% York%' OR City LIKE 'York%'

【讨论】:

  • 这不会大大减慢查询速度吗?里面有两个LIKE。我想使用类似查询的表有更多数据,然后是我在问题中发布的演示。不是有一个内置的mysql函数可以做到这一点吗?
  • 不,您的查询已经是对 City 的昂贵表扫描,因为 like 查询中的前导 %。添加一个额外的条件不会产生可衡量的影响。简单的替代方法是将每一行拆分为空格并进行组扫描(慢得多)或正则表达式(慢得多)。一旦你进行了表扫描,无论如何你有点搞砸了,但至少它是线性缓慢的。
  • 感谢您的详细回答:)
  • @AdamBaranyai 现在可以看到正则表达式了。
  • 如前所述,如果在大量数据上频繁运行此查询,则正则表达式(“正则表达式”的缩写)会在某种程度上破坏您的服务器。虽然在没有更多关于服务器和用例的知识的情况下无法准确估计,但可以肯定的是,它会比使用LIKE 的直接部分字符串匹配慢 10 到 100 倍。
【解决方案2】:

如果我们假设每个单词都由一个空格分隔,那么您可以拆分查询以查找以 York 开头的字段和包含“York”的字段。这将找到除伦敦和唐约克以外的所有地方。

SELECT * FROM table WHERE City LIKE '% York%' OR City LIKE 'York%'

【讨论】:

  • 这不会大大降低查询速度吗?里面有两个LIKE。我想使用类似查询的表有更多数据,然后是我在问题中发布的演示。不是有一个内置的mysql函数可以做到这一点吗?
猜你喜欢
  • 2017-08-14
  • 2013-06-10
  • 1970-01-01
  • 2022-01-10
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多