繁体   English   中英

如何对SELECTED ARRAY列执行通配符WHERE子句

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM