2013-11-15 37 views
1

我有以下表格:越来越类别ID FO多个短名称通过

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

目前尚不清楚你需要什么。你的查询中有'parentcategoryid'和'category_id',但不在你的表格定义中。最好提供一个合适的表格定义:你在psql中用'\ d tbl'得到的东西。如果您很难描述您需要的内容,请添加预期结果以进行说明。和你一样的Postgres版本一如既往。 –

回答

1

要实际使用与ILIKE的模式匹配,您的不能使用使用简单的IN expression。相反,你需要ILIKEANY (...) or ALL (...),这取决于你是否要进行或运算或者与运算测试:

此外,您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}'); 

..评估之前。