gpt4 book ai didi

sql - 在 Oracle SQL 中是否有类似 Python 的 list zip 函数的集合?

转载 作者:行者123 更新时间:2023-12-05 07:13:15 24 4
gpt4 key购买 nike

在为性能重构一些复杂的PL/SQL包时,我有几次遇到以下情况:

输入:两个相同长度的PL/SQL VARRAY A和B或TABLE(例如SYS.ODCIVarchar2List),例如

A := SYS.ODCIVarchar2List('Summer', 'Winter');
B := SYS.ODCIVarchar2List('hot', 'cold');

(列表中给定索引处的条目相互对应)。

现在,我有一个或多或少复杂的 SQL 语句(例如 MERGE INTO),我需要假设的“zip(A,B)”作为输入。

到目前为止我找到的唯一解决方案是这样的构造:

with t1 as (select rownum rn, column_value as season from table(:A))
, t2 as (select rownum rn, column_value as temperature from table(:B))
, input as (select t1.season, t2.temperature
from t1, t2
where t1.rn = t2.rn
)
-- Now do something with the input. For demonstration purpose, just show it:
select * from input;

这可行,但对于这样一个简单的任务来说似乎过于复杂。

有更好的解决方案吗?

备注:我知道关于“从表中选择(...)”的顺序的理论不确定性。这一直有效,所以我们不要在这里讨论它,直到有一天有人可以展示一个它不起作用的例子。

作为旁注(并进一步澄清问题):在 Python 中,我可以这样做:

L=[1,2]
M=["A","B"]
list(zip(L,M))

这将返回一个与 L 和 M 长度相同的列表,其中的条目组合在一起:

[(1, 'A'), (2, 'B')]

我需要的是 SQL 中的类似内容。

最佳答案

这可以在 SQL 中使用 MODEL 子句来完成。这有点棘手但非常有效......这是代码:

WITH
lists AS
(
Select 'Summer, Winter' "L", 'Hot, Cold' "M" From Dual
),
mdl AS
(
SELECT
INDX, L, M,
L_LIST,
M_LIST
FROM
lists
MODEL
DIMENSION BY (0 as INDX)
MEASURES (L, M, REPLACE(L, ', ', ',') as L_LIST, REPLACE(M, ', ', ',') as M_LIST)
RULES ITERATE(2)
(
L[ITERATION_NUMBER + 1] = SubStr(L_LIST[ITERATION_NUMBER], 1, CASE WHEN InStr(L_LIST[ITERATION_NUMBER], ',') = 0 THEN 100
ELSE InStr(L_LIST[ITERATION_NUMBER], ',', ITERATION_NUMBER + 1) - 1
END),
L_LIST[ITERATION_NUMBER + 1] = SubStr(REPLACE(L_LIST[ITERATION_NUMBER], L[ITERATION_NUMBER + 1], ''), 2),
M[ITERATION_NUMBER + 1] = SubStr(M_LIST[ITERATION_NUMBER], 1, CASE WHEN InStr(M_LIST[ITERATION_NUMBER], ',') = 0 THEN 100
ELSE InStr(M_LIST[ITERATION_NUMBER], ',', ITERATION_NUMBER + 1) - 1
END),
M_LIST[ITERATION_NUMBER + 1] = SubStr(REPLACE(M_LIST[ITERATION_NUMBER], M[ITERATION_NUMBER + 1], ''), 2)
)
),
combined AS
(
SELECT
INDX,
SubStr(LISTAGG(L || ',', ',') WITHIN GROUP (ORDER BY INDX) || ' ' || LISTAGG(M || ',', ',') WITHIN GROUP (ORDER BY INDX),
1, Length(LISTAGG(L || ',', ',') WITHIN GROUP (ORDER BY INDX) || ' ' || LISTAGG(M || ',', ',') WITHIN GROUP (ORDER BY INDX)) - 1) "LIST"
FROM
mdl
WHERE
INDX > 0
GROUP BY
INDX, L, M
)
SELECT
'[' || LISTAGG('(' || LIST || ')', ', ') WITHIN GROUP (ORDER BY INDX) || ']' "ZIPPED_LIST"
FROM
combined
--
-- Result
--
-- ZIPPED_LIST
-- [(Summer, Hot), (Winter, Cold)]

关于sql - 在 Oracle SQL 中是否有类似 Python 的 list zip 函数的集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60212501/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com