假设我有一个类似以下的查询:
SELECT CASE WHEN ONE = 1 THEN 1 ELSE 0 END, CASE WHEN JUST_ONE = 1 THEN 1 ELSE 0 END, CASE WHEN ANOTHER_ONE = 1 THEN 1 ELSE 0 END, CASE WHEN TWO = 1 THEN 1 ELSE 0 END, CASE WHEN JUST_TWO = 1 THEN 1 ELSE 0 END, CASE WHEN ANOTHER_TWO = 1 THEN 1 ELSE 0 END -- 20 more things like that where changes only columns name FROM SOME_TABLE;
如您所见,这两组之间的唯一区别是,在第一组中,我使用具有“ ONE”的列,在第二组中,具有“ TWO”的列,在我的实际查询中,我大约有30个这样的组,因此我想知道是否有某种方法可以缩短它?
由于它们是不同的列,因此必须在SELECT列表中分别明确提及它们。您不能在纯 SQL中 动态地执行此操作。
我建议使用一个好的 文本编辑器 ,几乎不需要一两分钟就能编写出整个SQL。
您可以使用 DECODE 语法少一些,而不要使用冗长的 CASE 表达式。
例如,
DECODE(ONE, 1, 1, 0) AS col1, DECODE(JUST_ONE, 1, 1, 0) AS col2, DECODE(ANOTHER_ONE, 1, 1, 0) AS col3, DECODE(TWO, 1, 1, 0) AS col4, DECODE(JUST_TWO, 1, 1, 0) AS col5, DECODE(ANOTHER_TWO, 1, 1, 0) as col6
我建议坚持使用 SQL ,而不要使用 PL / SQL 。它们不一样,它们是不同的引擎。PL --> Procedural Language。
PL --> Procedural Language
但是,如果您坚持要使用,则可以使用 游标进行循环, 以遍历[ DBA | ALL | USER] _TAB_COLS中的 所有列。您可以使用 SYS_REFCURSOR 来查看数据。首先,您必须构建 动态SQL 。