2014-10-17 52 views
1

我有以下的sql查询。我希望结果与,连接,我需要这个作为一个单一的查询。将多行Select语句结果转换为单行字符串结果

Select LOCATION_CODE from LOCATION WHERE ZIPCODE = '555555'; 

位置表

location_id | location_code | zipcode 
-------------------------------------------- 
     1  | ASDFSFD  | 555555  
     2  | OUIXVCX  | 555555 
     3  | 2KLJSDF  | 555555 
     14  | 887CSD  | 555555 

需要的结果类似下面... ASDFSFD,OUIXVCX,2KLJSDF,887CSD

回答

2
with location_code as (
select 'ASDFSFD' loc_code, 555555 zipcode from dual 
union all select 'OUIXVCX', 555555 from dual 
union all select '2KLJSDF', 555555 from dual 
union all select '887CSD', 555555 from dual 
) 
select rtrim (xmlagg (xmlelement (e, loc_code || ',')).extract ('//text()'), ',') 
from location_code where zipcode = 555555; 
+0

那是很大的。它像魅力一样工作。 – Zeus 2014-10-17 22:55:40

+0

您可以执行以下操作来使用自定义分隔符:'rtrim(xmlagg(xmlelement(e,loc_code ||'|'))。extract('// text()'),'|')'where'|'是一个自定义分隔符。它甚至似乎适用于多字符分隔符(例如'||')。顺便说一句,这是一个很好的解决方案。 – 2014-10-22 15:05:43

1

如果您使用的是Oracle 10g中,您还可以使用无证聚合函数WM_CONCAT()

SELECT WM_CONCAT(location_code) FROM location WHERE zipcode = 555555; 

一个可能的警告是WM_CONCAT()在Oracle 10g的某些版本(例如10.2.0.5)中返回CLOB,而在其他版本(例如10.2.0.1)中返回VARCHAR2。

你也可以开发你自己的字符串连接集合函数;请具体请参阅以下链接(以及如何完成字符串连接等方法):

http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php#wm_concat

+0

我非常喜欢这种方法。我得到了clob,所以,我通过使用to_char() – Zeus 2014-10-22 14:34:38

+1

将它转换为char。还有,我们可以使用自定义分隔符而不是a的方式吗?我仍在阅读链接,至今没有发现任何内容。 – Zeus 2014-10-22 14:47:39

+0

这对于'WM_CONCAT()'是不可能的,但如果您编写自己的自定义聚合函数(链接中包含这些指令),则可能会发生这种情况。例如,如果您查看成员函数'ODCIAggregateIterate',您可以看到字符串与逗号分隔符连接的位置,并将该分隔符替换为自定义分隔符。请记住,实际上有三个成员函数需要更新。 – 2014-10-22 15:01:52