如何转换逗号分隔列表中的列数据
Posted
技术标签:
【中文标题】如何转换逗号分隔列表中的列数据【英文标题】:How to convert columns data in comma separated list 【发布时间】:2013-03-13 01:04:52 【问题描述】:我的情况有点奇怪。它是一个第三方应用程序,从前端不允许调用用户过程或 udf/标量函数。
唯一的选择是编写 SQL,下面是我的数据的外观。 第一张图片有错误,最后一个 PID 应该是 1,倒数第二个是 2。
我需要的是这个,
这可以在 Advantage Database Server 9 中使用 UDF/游标轻松完成,但我别无选择。我不知道这是否真的可能。在 Sybase 中有一个名为 list 的函数,它可以很容易地完成这种工作,但在这里不确定。
应用程序确实允许调用内置函数。
【问题讨论】:
它有类似 GROUP_CONCAT 的东西吗? 我不知道,但我正在搜索文档 如果没有,请阅读此讨论。它可以帮助您实现等价物。 sqlservercentral.com/Forums/Topic984025-391-1.aspx 目前不支持 GROUP_CONCAT,但正在处理中。如果您使用的是 ADS 9 或更高版本,并且第三方应用程序使用数据字典作为后端数据库(在连接路径中查找 *.add),那么您应该能够编写一个用户定义的函数来返回它。 UDF 作为普通 SQL 语句的一部分被调用。因此,如果允许您执行自己的 SQL,您应该能够毫无问题地定义和使用 UDF。 我今天会尝试写它,但我想确保我正确关闭光标。我将在当天晚些时候发布代码,请您确认我正确关闭了光标。 【参考方案1】:declare @table table
(
PID integer,
Medicine varchar(10) )
insert into @table values (1, 'ABC')
insert into @table values (2, 'ABC')
insert into @table values (1, 'DEF')
insert into @table values (2, 'DEF')
insert into @table values (1, 'GHI')
SELECT DISTINCT a.PID,
Medicine = STUFF((SELECT ',' + b.Medicine
FROM @table b
WHERE a.PID = b.PID
FOR XML Path('')),1,1,'')
FROM @table a
结果:
**PID Medicine**
1 ABC,DEF,GHI
2 ABC,DEF
【讨论】:
STUFF 不是 Advantage 中的支持功能。 所有 STUFF 所做的只是从 XML 路径查询中删除返回字符串中的第一个,
字符。您可以通过多种方式删除它,但 STUFF 是最简单的,因为不需要知道字符串的长度。【参考方案2】:
我最终通过连接到数据字典创建了以下函数,但我得到了错误。
创建函数 GetReport_Meds ( PID varchar(15) ) 返回字符串 开始 声明药物字符串; DECLARE CurMeds 光标 AS SELECT med_code from drug where patient = TRIM(PID) 和 end_date 为空; 药物 = ""; 打开 CurMeds; 同时获取 CurMeds 做 药物 = TRIM(Meds)+TRIM(CurMeds.med_code)+","; 结束; 关闭 CurMeds; 返回左(Meds,LEN(Meds)-1); 结尾;poQuery:错误 7200:AQE 错误:状态 = HY000;本机错误 = 5054; [iAnywhere 解决方案][Advantage SQL][ASA] 错误 5054:该命令无法 以当前用户权限完成。不能 在数据字典中创建函数对象。
我已要求创建此数据库/应用程序的公司在数据库中添加此功能,以便我可以使用它,让我看看我在哪里登陆。
【讨论】:
以上是关于如何转换逗号分隔列表中的列数据的主要内容,如果未能解决你的问题,请参考以下文章