【发布时间】:2017-04-10 16:46:52
【问题描述】:
您好,有一个包含 9 列的表,这些列具有相同的数据类型(都是百分比值)。我正在尝试在 PL\SQL 函数中创建一个 Select 语句以返回 3 的元组,具体取决于外部参数值。
语法上是这样的:
WITH tmp
AS (SELECT '1' col1,
'2' col2,
'3' col3,
'4' col4,
'5' col5,
'6' col6,
'7' col7,
'8' col8,
'9' col9
FROM DUAL
UNION
SELECT '10' col1,
'20' col2,
'30' col3,
'40' col4,
'50' col5,
'60' col6,
'70' col7,
'80' col8,
'90' col9
FROM DUAL
UNION
SELECT '100' col1,
'200' col2,
'300' col3,
'400' col4,
'500' col5,
'600' col6,
'700' col7,
'800' col8,
'900' col9
FROM DUAL)
SELECT CASE
WHEN externaparameter = 1 THEN (col1, col2, col3)
WHEN externaparameter = 2 THEN (col4, col5, col6)
WHEN externaparameter = 3 THEN (col7, col8, col9)
END
INTO var1, var2, var3
FROM tmp;
对此我有两种解决方案:
为每一列实现 CASE 语句。但它会创建一个很大的 select 语句,并且可能会造成混淆。
SELECT CASE
WHEN externaparameter = 1 THEN col1
WHEN externaparameter = 2 THEN col4
WHEN externaparameter = 3 THEN col7
END,
CASE
WHEN externaparameter = 1 THEN col2
WHEN externaparameter = 2 THEN col5
WHEN externaparameter = 3 THEN col8
END,
CASE
WHEN externaparameter = 1 THEN col3
WHEN externaparameter = 2 THEN col6
WHEN externaparameter = 3 THEN col9
END
INTO var1, var2, var3
FROM tmp;
或者,用一个联合执行三个 select 语句。但是我的原始查询有几个 WHERE 条件,对于这种情况,我需要重复它们。
SELECT a, b, c
INTO var1, var2, var3
FROM (SELECT col1 a, col2 b, col3 c
FROM tmp
WHERE externalparameter = 1
UNION
SELECT col4 a, col5 b, col6 c
FROM tmp
WHERE externalparameter = 2
UNION
SELECT col7 a, col8 b, col9 c
FROM tmp
WHERE externalparameter = 3)
对于这个问题,我有没有更简洁的 Select 语句?每种解决方案的优缺点是什么?
【问题讨论】:
-
这种方法听起来有点做作。相反,我会考虑使用单个过程来封装返回所有行的单个 SQL,然后用过程或过程包装它以解释参数并返回适当的行。