SQL 同时使用 LIKE 和 ANY
SQL Using LIKE and ANY at the same time
我有一个 table,其中有一个类型为 text
的列 feature
和一个名为 args
的文本数组 (text[]
)。我需要 select 从 table 那些行中 feature
列至少包含 的一个元素args
数组。
我尝试了不同的选择,包括:
SELECT * FROM myTable WHERE feature LIKE '%' + ANY (args) + '%';
但这不起作用。
简单的解决方案是改用正则表达式匹配运算符 ~
,它按原样处理 arg
中的字符串(不连接通配符):
SELECT *
FROM tbl
WHERE feature ~ ANY(args);
string ~ 'pattern'
大部分等同于 string LIKE '%pattern%'
,但 不完全等同于 ,因为 LIKE
使用与 [ 不同(且更少)的特殊字符=12=]。参见:
- Escape function for regular expression or LIKE patterns
如果不能接受这种细微差别,这里是您所要求的精确实现:
SELECT *
FROM tbl t
WHERE t.feature LIKE ANY (SELECT '%' || a || '%' FROM unnest(t.args) a);
解除数组嵌套,用通配符填充每个元素,然后将 LIKE ANY
与结果集一起使用。
参见:
- IN vs ANY operator in PostgreSQL
我有一个 table,其中有一个类型为 text
的列 feature
和一个名为 args
的文本数组 (text[]
)。我需要 select 从 table 那些行中 feature
列至少包含 的一个元素args
数组。
我尝试了不同的选择,包括:
SELECT * FROM myTable WHERE feature LIKE '%' + ANY (args) + '%';
但这不起作用。
简单的解决方案是改用正则表达式匹配运算符 ~
,它按原样处理 arg
中的字符串(不连接通配符):
SELECT *
FROM tbl
WHERE feature ~ ANY(args);
string ~ 'pattern'
大部分等同于 string LIKE '%pattern%'
,但 不完全等同于 ,因为 LIKE
使用与 [ 不同(且更少)的特殊字符=12=]。参见:
- Escape function for regular expression or LIKE patterns
如果不能接受这种细微差别,这里是您所要求的精确实现:
SELECT *
FROM tbl t
WHERE t.feature LIKE ANY (SELECT '%' || a || '%' FROM unnest(t.args) a);
解除数组嵌套,用通配符填充每个元素,然后将 LIKE ANY
与结果集一起使用。
参见:
- IN vs ANY operator in PostgreSQL