DB2 sql查询,以避免结果与多个" in子句"的排列组合

时间:2017-05-29 06:10:35

标签: sql db2

我正在尝试从表格中获取数据(颜色)' X'对于模型和年龄组合。

model     yr      color
a        2007    yellow,black
b        2008    yellow,orange,pink

因此对于(a,2007),它应该返回" yellow,black"

SELECT * from X where model in (a,b) and yr in (2007,2008) =>返回所有组合

我试过SELECT * from X where (model,yr) in (VALUES(a,2007),(b,2008)) =>查询未执行。语法错误。

我该怎么办?

3 个答案:

答案 0 :(得分:1)

以下内容应返回所需的结果。你是否在字符串常量周围使用了引号?

select color from foo where (model,yr) in (values ('a',2007),('b',2008))

答案 1 :(得分:0)

根据DB2(LUW,ZOS,AS400)的变体,您可能必须使用VALUESSYSDUMMY1表。

DB2 zOS的解决方案如下:

SELECT * FROM x WHERE (model,yr) IN 
(SELECT a,2007 FROM SYSIBM.SYSDUMMY1 
 UNION 
 SELECT b,2008 FROM SYSIBM.SYSDUMMY1) 

如果您希望传递一组model,year元组参数,可以使用XMLTABLE函数将XML参数解析为合成表。

SELECT * FROM x WHERE (model,yr) IN 
(select "model","year" from 
 param,xmltable(
 '$Q/q/r' PASSING ? AS "Q"
 columns
 "model" varchar(30) path '@model',
 "year" integer path '@year'
 ) AS "Q"
) 

查询的格式为



<q>
<r model="a" year="2007" />
<r model="b" year="2008" />
</q>
&#13;
&#13;
&#13;

答案 2 :(得分:0)

其他解决方案:

select * 
from foo t1 
inner join table (values ('a',2007),('b',2008)) t2(Key1, key2) 
on (t1.model, t1.yr)=(t2.Key1, t2.Key2)