Oracle SQL如何将行字段转为逗号分隔字符串?附实例需求
嘿,这个需求我经常碰到,在Oracle SQL里有几种简单的方式能把单条记录的字段值转成你想要的逗号分隔字符串,给你分享两种实用方案:
方案一:直接字段拼接(适合字段少的场景)
这种方式最直接,就是把每个字段按顺序用Oracle的字符串连接符||拼起来,注意日期字段要转成你需要的格式:
SELECT EMPLOYEE_ID || ',' || FIRST_NAME || ',' || LAST_NAME || ',' || EMAIL || ',' || PHONE_NUMBER || ',' || TO_CHAR(HIRE_DATE, 'DD/MM/RR') || ',' || JOB_ID || ',' || SALARY || ',' || MANAGER_ID || ',' || DEPARTMENT_ID AS comma_separated_result FROM HR.EMPLOYEES WHERE EMPLOYEE_ID = 100;
这里用TO_CHAR(HIRE_DATE, 'DD/MM/RR')把日期转成你示例里的17/06/03格式,要是有字段可能为空,记得用NVL(字段名, '')把null转成空字符串,避免出现连续逗号。
方案二:用LISTAGG聚合(适合字段多或需要灵活调整的场景)
如果字段比较多,一个个写||太麻烦,可以用LISTAGG配合SYS.ODCIVARCHAR2LIST来实现,把所有字段转成一个虚拟表的行,再聚合拼接:
SELECT LISTAGG(col_val, ',') WITHIN GROUP (ORDER BY 1) AS comma_separated_result FROM HR.EMPLOYEES emp, TABLE( SYS.ODCIVARCHAR2LIST( emp.EMPLOYEE_ID, emp.FIRST_NAME, emp.LAST_NAME, emp.EMAIL, emp.PHONE_NUMBER, TO_CHAR(emp.HIRE_DATE, 'DD/MM/RR'), emp.JOB_ID, emp.SALARY, emp.MANAGER_ID, emp.DEPARTMENT_ID ) ) cols(col_val) WHERE emp.EMPLOYEE_ID = 100;
这种方式后续要调整字段顺序或者增减字段,只要修改SYS.ODCIVARCHAR2LIST里的内容就行,维护起来更方便。
执行任意一种方案,你都能得到预期的结果:100,Steven,King,SKING,515.123.4567,17/06/03,AD_PRES,29000,105,90
内容的提问来源于stack exchange,提问作者Boussadjra Brahim
相关产品推荐
相关产品推荐

