Oracle—选择语句别名一列,并使用通配符获取所有剩余列



SQL新手。如果这个问题是一个基本问题,请原谅。有没有办法让我在下面这样做

SELECT COLUMN1 as CUSTOM_NAME, <wildcard for remaining columns as is> from TABLE;

我只希望COLUMN1在最终结果中出现一次

没有办法用常规SQL*生成那种动态SELECT列表。

这是一件好事。编程越是动态就越困难。即使是简单的*语法,虽然在许多上下文中都很有用,但也会导致生产代码出现问题。Oracle SQL语法已经比大多数传统编程语言更复杂,添加一点元语言来描述查询返回的内容可能是一场噩梦。

*好吧,可以使用Oracle数据盒式磁带或DBMS_XMLGEN或PIVOT子句创建一些东西。但这些解决方案中的每一个都会非常复杂,当然不会像键入列那么简单。

这是最接近的。它非常方便地将重要的列放在前面,同时能够在需要时滚动到其他位置。COLUMN1最终会出现两次。

SELECT COLUMN1 as CUSTOM_NAME, 
       aliasName.*
FROM TABLE aliasName;

如果您有很多列,那么可能值得自动生成一个完整的列列表,而不是依赖于*选择器。

因此,一个分两步的方法是生成列列表,其中包含自定义的前N列和其他列的未指定顺序,然后在实际的select语句中使用此生成的列表。

-- select comma separated column names from table with the first columns being in specified order
select
LISTAGG(column_name, ', ') WITHIN GROUP (
  ORDER BY decode(column_name,
                  'FIRST_COLUMN_NAME', 1,
                  'SECOND_COLUMN_NAME', 2) asc) "Columns"
from user_tab_columns
where table_name = 'TABLE_NAME';

用实际名称替换TABLE_NAMEFIRST_COLUMN_NAMESECOND_COLUMN_NAME,根据需要调整显式列的列表。

然后执行查询并使用结果,结果应该看起来像

FIRST_COLUMN_NAME, SECOND_COLUMN_NAME, OTHER_COLUMN_NAMES

当然,这是5位列的开销,但如果您遇到一个列数为3位的公司数据库,这可能会很有趣。

最新更新