在 concat、oracle 期间格式化列标题

Posted

技术标签:

【中文标题】在 concat、oracle 期间格式化列标题【英文标题】:format column headers during concat,oracle 【发布时间】:2013-11-15 13:15:07 【问题描述】:

我需要在使用 concat 时在 sql 的输出中格式化列标题 例如:

SELECT '' || to_char(sysdate,'ddmmyyyy') as DATE || ',' || ENO|| ',' || NAME|| ''  
FROM EMP;

会找回我

ORA-00923:在预期的地方找不到 FROM 关键字。

需要输出为:

DATE   ENO   NAME
-----------------
251013 7560  RAM
251013 7561  ROSS

这种格式有效

SELECT to_char(sysdate,'ddmmyyyy') || ',' || ENO || ',' || NAME as "DATE,ENO,NAME" 
FROM EMP

但我有一个问题

ORA-00972: 标识符太长

当“”内的列名长度超过30个字符时

例如:

SELECT to_char(sysdate,'ddmmyyyy') || ',' || ENO || ',' || NAME ||
       ',' || EMPLOYEE_IDENTIFICATION_NUMBER as "DATE,ENO,NAME,EMPLOYEE_IDENTIFICATION_NUMBER" 
FROM EMP;

【问题讨论】:

Oracle 中标识符的最大长度为 30 个字符,因此列的别名不能超过 30 个字符,这就是您收到此错误的原因。 不是单列名超过30个字符 因此,尝试找出是否有办法避免 ORA-00972,同时使用 concat 在别名中有多个列名 您有一个超过 30 个字符的名称,即别名。 别名是标识符,就像列名一样。在这里,您只有一个包含表中列名称的字符串,而这个“字符串”是一个标识符,是您连接列的别名。无法指定更长的别名。 无法指定更长的别名。但是,您可以使用标题从DUAL 中的单行创建UNION,按一些额外添加的列排序,您将拥有您需要的东西(或多或少)。我猜你正在将结果保存到文件中?在这种方法中,标题实际上是一行,但它的值将是您想要的标题字符串。 【参考方案1】:

要实现此输出,您必须像这样构建查询 SELECT to_char(sysdate,'ddmmyyyy') || ',' || ENO || ',' || NAME as "DATE,ENO,NAME" FROM EMP

【讨论】:

此格式有效 SELECT to_char(sysdate,'ddmmyyyy') || ',' ||伊诺 || ',' || NAME 来自 EMP,但我遇到了 ORA-00972 的问题:当“”中的列名长度超过 30 个字符时,标识符太长 例如:SELECT to_char(sysdate,'ddmmyyyy') | | ',' ||伊诺 || ',' ||姓名 || ',' || EMPLOYEE_IDENTIFICATION_NUMBER 作为“DATE,ENO,NAME,EMPLOYEE_IDENTIFICATION_NUMBER”来自 EMP;引发 ORA-00972: 标识符太长【参考方案2】:

如果确实需要,您需要将别名移到SELECT 子句的末尾。也可以删除空字符串(''):

SELECT to_char(sysdate,'ddmmyyyy') || ',' || ENO || ',' || NAME as DATE FROM EMP;

【讨论】:

以上是关于在 concat、oracle 期间格式化列标题的主要内容,如果未能解决你的问题,请参考以下文章

Oracle列转行函数vm_concat在19C版本不兼容解决方案

oracle列转行函数

oracle中WMSYS.WM_CONCAT 函数关系的列出现乱码

Oracle一列的多行数据拼成一行显示

将数据库一个表的两列数据合并且去重

oracle列转行 WM_CONCAT LISTAGG