问题描述
我有一个带有TEXT []列的表。我想返回所有具有至少一个包含我的参数的数组值的行。
现在我正在做WHERE array_to_string(arr,',') ilike '%myString%'
但是我觉得他们必须是进行此类搜索的更好的优化方法。 另外,我还想搜索以我的参数开头或结尾的值。
CREATE TABLE IF NOT EXISTS my_table
(
id BIGSERIAL,col_array TEXT[],CONSTRAINT my_table_pkey PRIMARY KEY (id)
)
insert into my_table(col_array)
VALUES ('{ABC,DEF}'),('{FGH,IJK}'),('{LMN}'),('{OPQ}');
select * from my_table where ARRAY_TO_STRING(col_array,') ilike '%F%';
这有效,因为它仅返回前两行。
您可以在此处找到sqlfiddle:http://sqlfiddle.com/#!17/09632/7
解决方法
我将使用子查询:
select t.*
from my_table t
where exists (select *
from unnest(t.col_array) as x(e)
where x.e ilike '%F%')
您可能需要重新考虑对模型进行非规范化的决定。
未设置数组;搜索特定的数组元素可能是数据库设计错误的标志。考虑使用单独的表,该表的每个行都将是一个数组元素。这将更易于搜索,并且可能会针对大量元素进行更好地缩放。