筛选SQL数组文本[]以查找包含参数的匹配值
我有一个带有TEXT[]列的表。我想返回至少有一个包含我的参数的数组值的所有行 现在我正在做筛选SQL数组文本[]以查找包含参数的匹配值,sql,arrays,postgresql,Sql,Arrays,Postgresql,我有一个带有TEXT[]列的表。我想返回至少有一个包含我的参数的数组值的所有行 现在我正在做WHERE array_to_string(arr,,')我喜欢“%myString%” 但我觉得他们的搜索方式一定是一种更好的优化方式。 另外,我还希望搜索以参数开头或结尾的值 创建不存在的表格我的表格 ( id BIGSERIAL, 列数组文本[], 约束my_table_pkey主键(id) ) 插入我的表格(列数组) 值({ABC,DEF}'), ({FGH,IJK}'), ({LMN}'),
WHERE array_to_string(arr,,')我喜欢“%myString%”
但我觉得他们的搜索方式一定是一种更好的优化方式。
另外,我还希望搜索以参数开头或结尾的值
创建不存在的表格我的表格
(
id BIGSERIAL,
列数组文本[],
约束my_table_pkey主键(id)
)
插入我的表格(列数组)
值({ABC,DEF}'),
({FGH,IJK}'),
({LMN}'),
({OPQ}');
从my_表中选择*,其中数组到字符串(col_数组,,')类似于“%F%”;
这是因为它只返回前2行
您可以在这里找到SQLFIDLE:我将使用子查询:
select t.*
from my_table t
where exists (select *
from unnest(t.col_array) as x(e)
where x.e ilike '%F%')
您可能需要重新考虑取消模型规范化的决定 数组不是集合;搜索特定数组元素可能是数据库设计错误的标志。考虑为每个项目使用一个单独的表,这将是一个数组元素。这将更容易搜索,并且对于大量元素可能具有更好的扩展性
谢谢你的帮助@a_horse_没有名字,我用
select 1
而不是select*
完成了这项工作,效果非常好。我知道数组在SQL中不应该进行这种过滤,我将在将来考虑这一点。select*
和select 1
之间的性能绝对没有任何区别,如果你期望的话。我期望它的性能会更高。你能找到一个链接来解释原因吗?显而易见的证据是,表达式甚至没有被计算过。您可以编写(从..中选择1/0)
,它不会抛出错误,因为它不作为存在的子查询时会抛出错误。
“因为结果只取决于是否返回任何行,而不取决于这些行的内容,所以子查询的输出列表通常不重要。”