通过一个以上的短名称获取categoryid

时间:2013-11-15 04:55:04

标签: postgresql

我有以下表格:

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

1 个答案:

答案 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}');

..在评估之前。