在我的java代码中,我编写了一个本机查询。下面的列表对象应该是可参数化的,如
list = ('a','b')
但我的意图是,只有当给定列表与常量 'a'、'b' ... 匹配时,才应执行其中一个子查询。
可以吗?
WITH A AS (SELECT ID FROM A WHERE 'a' in list), (SELECT ID FROM B WHERE 'b' in list), (SELECT ID FROM C WHERE 'c' in list), (SELECT ID FROM D WHERE 'd' in list)
如您所知,@The Impaler 说:SQL 是一种声明式语言,而不是命令式语言。它只能以逻辑方式进行选择。您可以通过将列表创建为表并使用转置矩阵(DB2 中的 LATERAL 函数)来实现您的结果。
WITH list (list_name) AS (VALUES 'A', 'B', 'C', 'D')
, A (ID1, values1) AS (VALUES (1, 'A'))
, B (ID2, values2) AS (VALUES (2, 'B'))
, C (ID3, values3) AS (VALUES (3, 'C'))
, D (ID4, values4) AS (VALUES (4, 'D'))
SELECT transposedID AS ID, transposedValues AS values FROM (
SELECT table_1.* FROM (
SELECT * FROM A,B,C,D
INNER JOIN list l1 ON 'A' in l1.list_name
INNER JOIN list l2 ON 'B' in l2.list_name
INNER JOIN list l3 ON 'B' in l3.list_name
INNER JOIN list l4 ON 'B' in l4.list_name
) AS table_1
) CROSS JOIN LATERAL (
VALUES
(ID1, values1),
(ID2, values2),
(ID3, values3),
(ID4, values4)
) AS Transposed(transposedID, transposedValues);
结果:
#|ID|VALUES|
-+--+------+
1| 1|A |
2| 2|B |
3| 3|C |
4| 4|D |