我如何找到';单词';以字符串形式使用SQL

我如何找到';单词';以字符串形式使用SQL,sql,Sql,我有一个简单的查询,其中我想获取所有包含单词“X5Mdr2”和“y4M2ra”的行 select id from airPort where dest_name like '%X5Mdr2%' and dest_name like '%y4M2ra%'; 前。 表:机场 id | dest_name | desc | ... 1 | .. <abcd> *X5Mdr2* </abcd

我有一个简单的查询,其中我想获取所有包含单词“X5Mdr2”和“y4M2ra”的行

select id from airPort where dest_name like '%X5Mdr2%' and dest_name like '%y4M2ra%';
前。 表:机场

id  |  dest_name                                           | desc  | ...
1   | .. <abcd> *X5Mdr2* </abcd> 28372 X5529 <*y4M2ra*> .. | ..    |
2   |   asdajsdjasdjasdja                                  | ..    |
3   | .. <wxyz> *X5Mdr2* </wxyz> 23812 X5529 <*y4M2ra*> .. | ..    |
id | dest|u name | desc |。。。
1   | ..  *X5Mdr2*28372X5529|
2 | asdajsdjasdja ||
3   | ..  *X5Mdr2*23812 X5529|

应该返回id:1,3


我怎样才能做到这一点?

你的目标是什么?现场地址是否为“main st”或“142”

在这种情况下,你应该写:

select * from customer where address like '%main st%' or address like '%142%';
还是两者都有

在这种情况下,您的查询应该已经起作用了。

[注意:在我回答问题时,问题被编辑为不同的问题]

你很接近。有一些小瑕疵。但是,不幸的是,它永远不会真正起作用


大概您想要匹配“123 Main St”和“123 Main St”,所以您需要不敏感地进行匹配。您可以通过在
地址上使用
lower()
并确保匹配的所有字母也是小写来实现这一点

lower(address) like '%main st%'

还有邮政编码的问题。现在你正在匹配任何有142个的东西。你只想要以142开头的东西,你不想要12142或31429。因此,在比赛开始时添加一个空格

address like '% 142%'
街道名称搜索也可以使用这种方法来避免选择“Germain street”


把这一切放在一起

SELECT *
FROM   customer
WHERE  lower(address) like '% main st%' AND
       address like '% 142%';

这只在一定程度上有效。例如,它将拾取纽约州纽约市主街142号公寓123号,邮编10005,因为它正在查找号码142。或者,如果他们使用逗号而不是空格来分隔邮政编码和州,会怎么样<代码>123 Main St,NY,NY,14205
则您将无法匹配邮政编码

如果您使用的是支持正则表达式的数据库,那么您可以改进一些匹配,但它永远不会是100%。匹配越复杂,数据库使用索引的可能性就越小,它每次都必须进行完整的表扫描


要真正解决这个问题,您必须预先解析您的地址,将它们分解为组件,并存储它们。这是一个棘手的问题。幸运的是,有很多库可以做到这一点,但这取决于您使用的语言。这是另一个问题。

您将邮政编码存储在街道地址的同一字段中?如果将它们都存储在同一个字段中,这听起来像是一个糟糕的数据库设计。您的
ex
是所有行的示例吗?还是你想要的那排?因为第二个没有以142开头的zip。如果需要查询zip,请将其自动存储在自己的列中。由于zip与地址的其余部分位于同一列中,这使得您的查询更难编写。我已重写了我的语句,以消除混淆。抱歉。这是一个更好的评论。是的,我想评论,我现在知道我做了什么。我是新来的,谢谢你的建议:)你的答案很好,我只是想知道这是否适用于包含多个子字符串的大字符串