DB2 SQL - 可以在不对每行值使用 "or" 的情况下查询值列表吗?
DB2 SQL - Possible to query a list of values without using "or" for each row of values?
我有一个值列表,我想知道是否可以通过所述列表进行查询,而不必为每一行值执行 "or" 或将它们添加到 table并查询 table(正如我即将做的)
比如说,我的清单是;
010, 46793, '329', '10'
011, 46798, '322', '12'
012, 33333, '111', '14'
我想这样查询;
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
WHERE (VALUEW VALUEX, VALUEY, VALUEZ) in(
(010, 46793, '329', '10'),
(011, 46798, '322', '12'),
(012, 33333, '111', '14'))
(语法失败)
而不是必须做;
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
WHERE (VALUEW VALUEX, VALUEY, VALUEZ) = (010, 46793, '329', '10')
OR (VALUEW VALUEX, VALUEY, VALUEZ) = (011, 46798, '322', '12')
OR (VALUEW VALUEX, VALUEY, VALUEZ) = (012, 33333, '111', '14')
请注意类似;
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
WHERE VALUEW IN(010, 011, 012)
AND VALUEX IN(46793, 46798, 33333)
AND VALUEY IN('329', '322', '111')
AND VALUEZ IN('10', '12', '14')
在这种情况下将不起作用。
例如,如果以下值存在于 "MYTABLE";
011, 33333, '329', '10'
前面提到的 SQL 会检索它,但它不在我的列表中。
尝试下面的语法(它在 Db2 LUW v11 上有效)不确定 Db2 for i:
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
where (VALUEW, VALUEX, VALUEY, VALUEZ) in ( values
(010, 46793, '329', '10'),
(011, 46798, '322', '12'),
(012, 33333, '111', '14')
);
非 LUW DB2 的替代解决方案:
WITH mylist(w,x,y,z) AS (
SELECT 010, 46793, '329', '10' FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT 011, 46798, '322', '12' FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT 012, 33333, '111', '14' FROM SYSIBM.SYSDUMMY1
)
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
INNER JOIN mylist
ON (VALUEW, VALUEX, VALUEY, VALUEZ)=(w,x,y,z)
我有一个 non-LUW DB2 的替代解决方案,它使用了 XMLTABLE
函数。这比 SYSDUMMY1 UNION ALL
方法允许更多的行。
SELECT TEST_NM, ITM_CD
FROM XMLTABLE('$doc/xml/node'
PASSING XMLPARSE('<xml>
<node test-nm="ABC 123" itm-cd="215" />
<node test-nm="DEF 345" itm-cd="151" />
<node test-nm="GHI 678" itm-cd="412" />
<node test-nm="JKL 901" itm-cd="410" />
<node test-nm="MNO 234" itm-cd="875" />
<node test-nm="PQR 567" itm-cd="249" />
<node test-nm="STU 890" itm-cd="817" />
</xml>') AS "doc"
COLUMNS TEST_NM VARCHAR(30) PATH '@test-nm',
ITM_CD INTEGER PATH '@itm-cd') AS Q;
我有一个值列表,我想知道是否可以通过所述列表进行查询,而不必为每一行值执行 "or" 或将它们添加到 table并查询 table(正如我即将做的)
比如说,我的清单是;
010, 46793, '329', '10'
011, 46798, '322', '12'
012, 33333, '111', '14'
我想这样查询;
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
WHERE (VALUEW VALUEX, VALUEY, VALUEZ) in(
(010, 46793, '329', '10'),
(011, 46798, '322', '12'),
(012, 33333, '111', '14'))
(语法失败)
而不是必须做;
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
WHERE (VALUEW VALUEX, VALUEY, VALUEZ) = (010, 46793, '329', '10')
OR (VALUEW VALUEX, VALUEY, VALUEZ) = (011, 46798, '322', '12')
OR (VALUEW VALUEX, VALUEY, VALUEZ) = (012, 33333, '111', '14')
请注意类似;
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
WHERE VALUEW IN(010, 011, 012)
AND VALUEX IN(46793, 46798, 33333)
AND VALUEY IN('329', '322', '111')
AND VALUEZ IN('10', '12', '14')
在这种情况下将不起作用。
例如,如果以下值存在于 "MYTABLE";
011, 33333, '329', '10'
前面提到的 SQL 会检索它,但它不在我的列表中。
尝试下面的语法(它在 Db2 LUW v11 上有效)不确定 Db2 for i:
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
where (VALUEW, VALUEX, VALUEY, VALUEZ) in ( values
(010, 46793, '329', '10'),
(011, 46798, '322', '12'),
(012, 33333, '111', '14')
);
非 LUW DB2 的替代解决方案:
WITH mylist(w,x,y,z) AS (
SELECT 010, 46793, '329', '10' FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT 011, 46798, '322', '12' FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT 012, 33333, '111', '14' FROM SYSIBM.SYSDUMMY1
)
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
INNER JOIN mylist
ON (VALUEW, VALUEX, VALUEY, VALUEZ)=(w,x,y,z)
我有一个 non-LUW DB2 的替代解决方案,它使用了 XMLTABLE
函数。这比 SYSDUMMY1 UNION ALL
方法允许更多的行。
SELECT TEST_NM, ITM_CD
FROM XMLTABLE('$doc/xml/node'
PASSING XMLPARSE('<xml>
<node test-nm="ABC 123" itm-cd="215" />
<node test-nm="DEF 345" itm-cd="151" />
<node test-nm="GHI 678" itm-cd="412" />
<node test-nm="JKL 901" itm-cd="410" />
<node test-nm="MNO 234" itm-cd="875" />
<node test-nm="PQR 567" itm-cd="249" />
<node test-nm="STU 890" itm-cd="817" />
</xml>') AS "doc"
COLUMNS TEST_NM VARCHAR(30) PATH '@test-nm',
ITM_CD INTEGER PATH '@itm-cd') AS Q;