[英]How to execute a wildcard WHERE clause against a SELECTed ARRAY column
我有以下SQL。 我试图将结果限制为仅具有匹配特定术语的任何标签(在标签列表中)的结果。 该SQL得到了简化-有更多的列和表-希望这可以说明我遇到的问题。
SELECT
account_id
, ARRAY( SELECT(label_name || '::' || label_group) AS label
FROM labels ) AS label_list
FROM accounts
WHERE
account_id = 1
AND
'%sale%' ILIKE ANY (label_list)
在此示例中,我只希望在每一行的标签列表中出现的“ label_name :: lable_group”中任何位置具有术语“ sale”的行。 为了进一步说明,我希望任何带有任何标签的行,例如“ saleorder :: presales”。
因此,当然,当我运行上面的查询时,我得到了:
ERROR: column "label_list" does not exist
我在StackOverflow上了解了为什么它不起作用,并且我明白这一点。
所以然后我尝试将子查询复制/粘贴到我的谓词中:
AND
'%sale%' ILIKE ANY (SELECT(label_name || '::' || label_group)
FROM labels)
而且即使有“ saleorder :: presales”标签,也不会出现任何错误,也不会出现匹配项。
但是,有趣的是,当我键入文字(非通配符)的label_name :: label_group值时,例如:
AND
'saleorder::presales' ILIKE ANY (SELECT(label_name || '::' || label_group)
FROM labels)
我得到了一场比赛,好像ILIKE表现得像=一样。
我需要能够在这种类型的列中搜索通配符值,并且在经过数小时的尝试不同的尝试后无法弄清楚。 我将不胜感激。
该模式在ILIKE的错误一侧。 本质上,您有'%bar%' ilike 'foobar'
我喜欢'%bar%' ilike 'foobar'
,而您需要'foobar' ilike '%bar%'
我喜欢'foobar' ilike '%bar%'
。 对于您的情况,我不知道有一种优雅的交换方式...
我能想到的最好的事情是:
select * from(
SELECT
account_id
, ARRAY( SELECT(label_name || '::' || label_group) AS label
FROM labels ) AS label_list
FROM accounts
WHERE
account_id = 1
)X
where exists(select * from unnest(label_list) U where U ilike '%sale%')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.