我如何找到';单词';以字符串形式使用SQL
我有一个简单的查询,其中我想获取所有包含单词“X5Mdr2”和“y4M2ra”的行我如何找到';单词';以字符串形式使用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
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与地址的其余部分位于同一列中,这使得您的查询更难编写。我已重写了我的语句,以消除混淆。抱歉。这是一个更好的评论。是的,我想评论,我现在知道我做了什么。我是新来的,谢谢你的建议:)你的答案很好,我只是想知道这是否适用于包含多个子字符串的大字符串