我有以下表格:
business
id catid subcatid
---------------------
10 {1} {10,20}
20 {2} {30,40}
30 {3} {50,60,70}
cat_subcat
catid shortname parent_id bid
--------------------------------------------
1 A 10
2 B 20
3 c 30
10 x 1 10
20 y 1 10
30 z 2 20
40 w 2 20
两个表都使用id进行关系。我得到的问题概述如下。这是我目前的查询:
SELECT ARRAY[category_id]::int[] from cat_subcat
where parentcategoryid IS not NULL and shortname ilike ('x,y');
我想为输入的category_id
获取shortname
,但我的查询未提供正确的输出。如果我传递一个shortname
,它将检索category_id
,但如果我传递多个shortname
,它将不会显示category_id
。请告诉我如何通过category_id
传递多个shortname
。
答案 0 :(得分:1)
要实际使用与ILIKE
匹配的模式,无法使用简单的IN
expression。相反,您需要ILIKE
ANY (...)
or ALL (...)
,具体取决于您是否希望测试ORed或ANDed:
此外,您的ARRAY
构造函数将应用于各行,这似乎毫无意义。我假设你想要这个(有根据的猜测):
SELECT array_agg(catid) AS cats
FROM cat_subcat
WHERE parent_id IS NOT NULL
AND shortname ILIKE ANY ('{x,y}');
好吧,只要您不为模式使用通配符(%
,_
),就可以将其翻译为:
AND lower(shortname) IN ('x','y');
但是那将是毫无意义的,因为Postgres在内部将其转换为:
AND lower(shortname) = ANY ('{x,y}');
..在评估之前。