我想在列中选择包含800,805,888 ...(有8种模式文本)的任何数据。
我是否必须为每一个使用8次相似的声明,还是有更快的方式?
示例:
SELECT * FROM caller,
WHERE id LIKE '%805%' OR id LIKE'%800' OR ... ;
(PS。我不允许创建另一个表,只使用sql查询。)
答案 0 :(得分:2)
LIKE
用于字符串,不用于数字。假设id
实际上是一个数字,首先需要将其强制转换为字符串,以便能够在其上应用LIKE
条件。
但是一旦你这样做,就可以使用一个数组:
SELECT *
FROM caller
WHERE id::text LIKE ANY (array['%805%', '%800', '81%']);
答案 1 :(得分:1)
将any()
与搜索项目数组一起使用:
with test(id, col) as (
values
(1, 'x800'),
(2, 'x855'),
(3, 'x900'),
(4, 'x920')
)
select *
from test
where col like any(array['%800', '%855'])
id | col
----+------
1 | x800
2 | x855
(2 rows)
写入时间较短但执行速度不快。