postgresql 如何检查一个字段是否包含至少一个子字符串形式的子字符串列表?

jv4diomz  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(228)

我有一张这样的table

one | two | three   |  code   | four 

-----+-------+-------+---------+--------

   0 | 21750 | 10110 | 1016916 |   20.0

   0 | 21750 | 10111 | 1017949 |   20.2 

   0 | 21750 | 10115 | 101792 |   21.0 

   0 | 21737 | 10110 | 100753 |   20.0  

   0 | 21737 | 10110 | 14343054 |   20.0

我想提取字段code至少包含以下子字符串之一的所有记录:
七九四四三十七
我该怎么做?

更新

我知道我可以通过写作来达到这个目的

select * from mytable where
code ilike '%794%' or
code ilike '%43%' or
code ilike '%17%';

但是想象在真实情况下,匹配子串以数组的形状(例如,('794', '43', '17')),它的长度大于100,所以我不想把这个数组重写成100+ WHERE个条件,每个条件对应于要在code字段中搜索的每个子字符串。
我试过

select * from mytable where code && '{"794", "43", "17"}';

但它会抛出这个错误

提示:未找到具有给定名称和参数类型的运算符。您可能需要显式转换类型。

gmol1639

gmol16391#

你可以在数组中使用unnest()作为输入,并使用正则表达式Map内容:

SELECT mytable.* 
FROM mytable
    JOIN unnest('{"794", "43", "17"}'::text[]) AS list(content) 
        ON code ~ content; -- regex
z18hc3ub

z18hc3ub2#

为了避免对每个子字符串重复where条件,您可以使用包含所有子字符串的cte,然后按以下方式与表进行联接:

with matching_list as
(
  select s from
  (values('794'),('43'), ('17')) as t(s)
)
select t.* 
from table_name t join matching_list mch
on strpos(t.code::text, mch.s)>0 -- or (on t.code::text like concat('%', mch.s, '%'))

demo

bxjv4tth

bxjv4tth3#

可以将SQL“LIKE”运算符与“OR”运算符结合使用,以提取“code”字段中包含任何指定子字符串的记录。在您的示例中:

SELECT *
FROM *your_table*
WHERE code LIKE '%794%' OR code LIKE '%43%' OR code LIKE '%17%';

要了解更多关于“LIKE”运算符的信息,我建议看一下这里的一些其他示例:SQL LIKE Operator

drkbr07n

drkbr07n4#

您可以将code字段转换为文本,然后使用LIKE

SELECT *
FROM yourTable
WHERE code::text LIKE '%794%' OR code::text LIKE '%43%' OR code::text LIKE '%17%';

如果你有很多子字符串,并希望避免冗长的WHERE子句,那么将你的子字符串加载到一个合适的表中:

Table: substrings
code
794
43
17

然后使用以下与原始表的联接来查找匹配项:

SELECT DISTINCT *
FROM yourTable t1
INNER JOIN substrings t2
    ON t1.code::text LIKE '%' || t2.code || '%';

相关问题