比较两列的字符串

时间:2019-06-22 14:39:14

标签: sql postgresql

我在Postgresql的一个表中工作。一栏没有名字,一栏包含人们的完整地址,有时包括名字。我想找到第二列中第一列中的条目所在的所有行。

示例

| id | firts_name   | address   |
|---|--------|------------------------|
| 1 | anna   | anna miller street 1   |
| 2 | bob    | b. smith street 2      |
| 3 | charly | charly wilson street 3 |

我想返回第1列和第3列

我尝试过

select id, first_name, address from table1
where first_name ~ address

我得到的结果总是空的。

3 个答案:

答案 0 :(得分:0)

波浪号(~)是正则表达式匹配运算符;在您的情况下,您可能可以使用简单的模式匹配运算符~~(或LIKE),并且确实需要通过添加通配符来创建用于匹配的模式:

select id, first_name, address from table1
where address ~~ concat('%', first_name, '%')

dbfiddle

答案 1 :(得分:0)

您的代码的主要问题是~的操作数是相反的。是target_string ~ pattern,反之亦然。

即:

select id, first_name, address from table1
where address ~ first_name;

但是,这会将first_name的内容解释为正则表达式。如果first_name包含正则表达式中的特殊字符,例如*?()+,这将产生意外的结果。 ,...

如果只想进行纯字符串搜索,则可以执行以下操作:

select id, first_name, address from table1
where position(first_name in address) > 0;

[Live demo]

答案 2 :(得分:0)

除非您要使用正则表达式,否则like可能会更简单:

select id, first_name, address
from table1
where address like '%' || first_name || '%';

like优于正则表达式的一个优点是Postgres有时会为其使用索引。但是,在这种情况下,当模式可变时,我认为不会。