我如何找到'单词'在带有SQL的字符串中

时间:2016-02-16 18:52:52

标签: sql

我有一个简单的查询,我希望获得所有行的单词' 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

我怎样才能做到这一点?

2 个答案:

答案 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%';

或者是否同时拥有它们?

在这种情况下,您的查询应该已经有效。