我在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
我得到的结果总是空的。
答案 0 :(得分:0)
波浪号(~
)是正则表达式匹配运算符;在您的情况下,您可能可以使用简单的模式匹配运算符~~
(或LIKE
),并且确实需要通过添加通配符来创建用于匹配的模式:
select id, first_name, address from table1
where address ~~ concat('%', first_name, '%')
答案 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;
答案 2 :(得分:0)
除非您要使用正则表达式,否则like
可能会更简单:
select id, first_name, address
from table1
where address like '%' || first_name || '%';
like
优于正则表达式的一个优点是Postgres有时会为其使用索引。但是,在这种情况下,当模式可变时,我认为不会。