请问如何用SQL语句把查询出来的多条记录组成一个字符串输出?

时间:2021-09-15 20:59:50
不好意思啊, 又来提问了. 现在呢是这样, 比如从数据库查到3条记录 (3个人名儿), 然后想组成一个字符串输出 (比如: "*, 弱智, 白痴"). 我知道用存储过程可以实现; 但现在的系统因为要Oracle和MySQL数据库无缝移植所以好像不能用存储过程. 所以想请大家帮着想个SQL语句来实现这个功能, 谢谢大家!!

12 个解决方案

#1


行转列的功能!
网上的例子很多!
http://cosio.itpub.net!

#2


http://topic.csdn.net/u/20090408/15/275bb681-0f03-422e-9af2-4d924969f0ff.html

#3


10G
select wmsys.wm_concat(name) from yourtable

#4


LS的ORACLE专有函数肯定也不能用的,LZ要考虑的是Oracle和MySQL数据库无缝移植

#5


排行榜第一和第三都回答你了,我没有什么好说的了

#6


有啥说的,就这样了

#7


SQL> select t.* from test_row_cell t;

        ID NAME
---------- --------------------
         1 A
         2 B
         3 C
         4 D
         5 E
         6 F
         1 B
         1 C
         4 A
         4 B
         4 C

11 rows selected

SQL> 
SQL> SELECT id, str
  2    FROM (SELECT id,
  3                 row_number() over(PARTITION BY id ORDER BY name) AS rn,
  4                 name || lead(',' || name, 1) over(PARTITION BY id ORDER BY name) || lead(',' || name, 2) over(PARTITION BY id ORDER BY name) || lead(',' || name, 3) over(PARTITION BY id ORDER BY name) AS str
  5            FROM test_row_cell)
  6   WHERE rn = 1
  7   ORDER BY 1;

        ID STR
---------- --------------------------------------------------------------------------------
         1 A,B,C
         2 B
         3 C
         4 A,B,C,D
         5 E
         6 F

6 rows selected

#8


谢谢大家的的回复!! 虽然现在暂时只看懂了3楼的语句. 不过啊... 嗯... 7楼的虽然还没看名白但是... 这个确实也可以在MySQL下执行么? 3楼的应该是只能在Oracle下执行吧 (也没关系, 先运行起来再说). 嗯... 反正现在就是查到了3个名字, 比如: "select NAME from EMP where SALARY = 1000"; 那么如果只针对这句话的话, 除了用Oracle专用的函数外, 要怎么修改才可以实现把3个名字组成一个字符串呢? 谢谢!!

#9


lz可以考虑把数据在oracle里处理好了之后,存到临时表里,在移植过去,不一定非要直接移植的时候处理。除了oracle专用函数外,估计只能用存储过程了。

#10


哦,mysql好像不能用row_number 。。

很多oracle特有的函数都不能用,又不给用存储过程,这个。。

#11


感兴趣,继续。

#12


这种需求想要做到无缝移植,就会写得很麻烦
单ORACLE有比较简单的方法如三楼的

#1


行转列的功能!
网上的例子很多!
http://cosio.itpub.net!

#2


http://topic.csdn.net/u/20090408/15/275bb681-0f03-422e-9af2-4d924969f0ff.html

#3


10G
select wmsys.wm_concat(name) from yourtable

#4


LS的ORACLE专有函数肯定也不能用的,LZ要考虑的是Oracle和MySQL数据库无缝移植

#5


排行榜第一和第三都回答你了,我没有什么好说的了

#6


有啥说的,就这样了

#7


SQL> select t.* from test_row_cell t;

        ID NAME
---------- --------------------
         1 A
         2 B
         3 C
         4 D
         5 E
         6 F
         1 B
         1 C
         4 A
         4 B
         4 C

11 rows selected

SQL> 
SQL> SELECT id, str
  2    FROM (SELECT id,
  3                 row_number() over(PARTITION BY id ORDER BY name) AS rn,
  4                 name || lead(',' || name, 1) over(PARTITION BY id ORDER BY name) || lead(',' || name, 2) over(PARTITION BY id ORDER BY name) || lead(',' || name, 3) over(PARTITION BY id ORDER BY name) AS str
  5            FROM test_row_cell)
  6   WHERE rn = 1
  7   ORDER BY 1;

        ID STR
---------- --------------------------------------------------------------------------------
         1 A,B,C
         2 B
         3 C
         4 A,B,C,D
         5 E
         6 F

6 rows selected

#8


谢谢大家的的回复!! 虽然现在暂时只看懂了3楼的语句. 不过啊... 嗯... 7楼的虽然还没看名白但是... 这个确实也可以在MySQL下执行么? 3楼的应该是只能在Oracle下执行吧 (也没关系, 先运行起来再说). 嗯... 反正现在就是查到了3个名字, 比如: "select NAME from EMP where SALARY = 1000"; 那么如果只针对这句话的话, 除了用Oracle专用的函数外, 要怎么修改才可以实现把3个名字组成一个字符串呢? 谢谢!!

#9


lz可以考虑把数据在oracle里处理好了之后,存到临时表里,在移植过去,不一定非要直接移植的时候处理。除了oracle专用函数外,估计只能用存储过程了。

#10


哦,mysql好像不能用row_number 。。

很多oracle特有的函数都不能用,又不给用存储过程,这个。。

#11


感兴趣,继续。

#12


这种需求想要做到无缝移植,就会写得很麻烦
单ORACLE有比较简单的方法如三楼的