1

我有以下表格:

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通过。

4

1 回答 1

1

要实际使用模式匹配ILIKE不能使用简单的IN表达式。相反,您需要ILIKE ANY (...)orALL (...),具体取决于您想要测试 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}');

..在评估之前。

于 2013-11-15T06:10:45.407 回答