字段拼接
名称 | 类别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;
我可以使用Oracle语句将在一个表中多个字段记录的信息进行拼接,可以按照以下步骤操作:
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为字段间的分隔符。
SELECT CONCAT_COL('table_name', 'name || '':'' || subject', ';')
FROM table_name;
其中,name和subject是需要拼接的两个字段,用"||"运算符连接起来,中间加上一个冒号,最后用中文分号分隔每个拼接结果。
需要注意的是,LISTAGG函数的字符数有限制,如果拼接的字符数超过了限制,则需要对数据进行分组拼接。