Oracle 如何使用相同的Select语句获取不同的表列
Hi有一个表,其中有9列具有相同的数据类型(都是百分比值)。我试图在PL\SQL函数中创建一个Select语句,根据外部参数值返回3的元组 在句法上,类似这样的东西:Oracle 如何使用相同的Select语句获取不同的表列,oracle,plsql,oracle12c,Oracle,Plsql,Oracle12c,Hi有一个表,其中有9列具有相同的数据类型(都是百分比值)。我试图在PL\SQL函数中创建一个Select语句,根据外部参数值返回3的元组 在句法上,类似这样的东西: WITH tmp AS (SELECT '1' col1, '2' col2, '3' col3, '4' col4, '5' col5, '6' col6,
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;
或者,使用union实现三个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语句?每种解决方案的优缺点是什么?如果您不能在运行时基于
externalparameter
有选择地运行三个单独查询中的一个,那么使用case
表达式的选项一是更干净的解决方案
联合体的问题
解决方案:
union
版本包含一个隐式distinct,如果第一个版本中的内容已经不同,那么它会增加工作。或者相对于第一个版本更改结果在这种情况下,有时会使用动态SQL,但我认为有选择地运行三条静态语句比构建动态SQL字符串要好。这种方法听起来有点胡闹。相反,我会考虑一个单一的过程,它封装一个返回所有行的SQL,然后用过程或PraceCeCs包对此进行解释,并返回适当的行。