我有一个简单的查询,我希望获得所有行的单词' X5Mdr2'和' y4M2ra'
select id from airPort where dest_name like '%X5Mdr2%' and dest_name like '%y4M2ra%';
离。 表:airPort
id | dest_name | desc | ...
1 | .. <abcd> *X5Mdr2* </abcd> 28372 X5529 <*y4M2ra*> .. | .. |
2 | asdajsdjasdjasdja | .. |
3 | .. <wxyz> *X5Mdr2* </wxyz> 23812 X5529 <*y4M2ra*> .. | .. |
...
应该返回id:1,3
我怎样才能做到这一点?
答案 0 :(得分:2)
[注意:在我回答时,问题被编辑为另一个问题]
你非常接近。有一些小缺陷。但是,不幸的是,它永远不会真正起作用。
据推测,你想要匹配“123 Main St”和“123 main st”,所以你需要不敏感地进行比赛。您可以使用lower()
上的address
并确保匹配中的所有字母也是小写字母来实现这一目标。
lower(address) like '%main st%'
然后是邮政编码的问题。现在你正在匹配142中的任何东西。你只需要开始的东西为142,你不需要12142或31429.所以在你的比赛开始时添加一个空格。
address like '% 142%'
街道名称搜索也可以使用这种处理来避免捡起“日耳曼街”。
全部放在一起......
SELECT *
FROM customer
WHERE lower(address) like '% main st%' AND
address like '% 142%';
这只在一定程度上起作用。例如,它会选择123 Main St Apt 142, NY, NY 10005
,因为它只是在寻找数字142.或者如果他们使用逗号而不是空格来将邮政编码与州分开? 123 Main St,NY,NY,14205
然后您将无法匹配邮政编码。
如果你正在使用支持正则表达式的数据库,你可以改进匹配,但它永远不会是100%。而且匹配越复杂,数据库就越不可能使用索引,每次都必须进行全表扫描。
要真正解决问题,您必须预先解析地址,将其分解为组件并存储它们。这是一个艰难而挑剔的问题。幸运的是,有很多库可以做到这一点,但这取决于你使用的语言。那是另一个问题。
答案 1 :(得分:-2)
你的目标是什么?拥有字段地址&#34; main st&#34;或&#34; 142&#34;?
在这种情况下你应该写:
select * from customer where address like '%main st%' or address like '%142%';
或者是否同时拥有它们?
在这种情况下,您的查询应该已经有效。