PostgreSQL-模式匹配-字符串到子字符串

时间:2018-07-13 14:22:15

标签: postgresql pattern-matching

我正在尝试根据匹配的邮政编码将数据库中的两个表连接起来,但是却在与单个数据行相关的多个邮政编码处苦苦挣扎。

表1 有2列(唯一ID 邮政编码)。记录可能在此列中仅包含一个邮政编码,或者以逗号分隔的形式包含多个邮政编码。

表2 也有两列(开发说明邮政编码)。在此表中,邮政编码列只能有一个邮政编码。

我想识别并加入表2中的邮政编码与之匹配或包含在表1中的相关列中。在每列中只有一个邮政编码的情况下,我已经能够做到这一点,但是目前无法在表1中有多个邮政编码的情况下执行此操作。

下面的代码带回具有单个邮政编码的匹配项。

SELECT      t1.id,
            t1.postcodes,
            t2.dev_description,
            t2.postcode
FROM        table1      AS  t1
INNER JOIN  table2  AS  t2
ON          t2.postcode LIKE    t1.postcodes
WHERE       t2.postcode =   'XXX XXX'

我曾经尝试使用'%'|| ||'%'和其他各种功能,但说实话有点茫然。

如果有人可以帮助,那就太好了! 谢谢

2 个答案:

答案 0 :(得分:0)

您可以加入:

',' || t1.postcodes || ',' like  '%,' || t2.postcode || ',%'

这将扩展为:

',1234AB,2345AB,3456AB,' like '%,1234AB,%'

或者您可以使用string_to_array并且@>包含运算符:

string_to_array(t1.postcodes, ',') @> array[t2.postcode]

这扩展为:

array['1234AB','2345AB','3456AB'] @> array['1234AB']

答案 1 :(得分:0)

嗯,我从未使用ON和LIKE来加入两个表。无论如何,请查找STRPOS命令。

可能是这样的: ... 或(STRPOS(t1.postcodes,t2.postcode)> 0) ...