oracle 语句设计

字段拼接

名称类别1类别2类别3
小米语文数学
小红数学
小蓝语文英语
小黄英语
小月

想要实现这样的拼接效果
小米 :语文、数学
小红:数学
小蓝:语文、英语
小黄:英语
小月:

拼接有记录的字段 ,sql 怎么写啊,oracle11g

SELECT 名称, CONCAT_WS('、',
IF(类别1 IS NOT NULL, '语文', NULL),
IF(类别2 IS NOT NULL, '数学', NULL),
IF(类别3 IS NOT NULL, '英语', NULL)) AS categories
FROM students

SELECT 名称:选择姓名字段;
CONCAT_WS('、', ...):使用“、”作为分隔符,拼接以下的字段内容;
IF(categoryX IS NOT NULL, '分类名称', NULL):如果该记录的categoryX字段不为空,则返回分类名称,否则返回NULL;
categories:指定拼接后的字段别名。

使用 LISTAGG GROUP 试试,可以参考下这个 http://t.csdn.cn/oGLY4
或者 CONCAT_WS 再case when分一下

SELECT 
    姓名,
    CONCAT_WS('、', 
        CASE WHEN 类别1 IS NOT NULL THEN 类别1 ELSE NULL END,
        CASE WHEN 类别2 IS NOT NULL THEN 类别2 ELSE NULL END,
        CASE WHEN 类别3 IS NOT NULL THEN 类别3 ELSE NULL END
    ) AS 拼接结果
FROM students;


  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/242975
  • 除此之外, 这篇博客: oracle的sql语句使用记录-单引号双引号中的 表设计,可发现字段名由小写变成了大写 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 不带引号的表设计

  • 以下回答由chatgpt基于相关博客总结生成:

    我可以使用Oracle语句将在一个表中多个字段记录的信息进行拼接,可以按照以下步骤操作:

    1. 创建一个函数,用于拼接多个字段的内容,可以使用LISTAGG函数,示例代码如下:
    CREATE OR REPLACE FUNCTION CONCAT_COL(table_name VARCHAR2, col_list VARCHAR2, sep VARCHAR2)
    RETURN VARCHAR2
    IS
      v_return VARCHAR2(32767);
    BEGIN
      SELECT LISTAGG(col_list, sep) WITHIN GROUP (ORDER BY col_list)
      INTO v_return
      FROM table_name;
      RETURN v_return;
    END CONCAT_COL;
    

    其中,table_name为表名,col_list是你需要拼接的字段列表,sep为字段间的分隔符。

    1. 调用上述函数,将需要拼接的字段列表传入,示例代码如下:
    SELECT CONCAT_COL('table_name', 'name || '':'' || subject', ';')
    FROM table_name;
    

    其中,name和subject是需要拼接的两个字段,用"||"运算符连接起来,中间加上一个冒号,最后用中文分号分隔每个拼接结果。

    需要注意的是,LISTAGG函数的字符数有限制,如果拼接的字符数超过了限制,则需要对数据进行分组拼接。