如何在不使用 XML 路径和临时变量的情况下以一个逗号分隔值获取列值

Posted

技术标签:

【中文标题】如何在不使用 XML 路径和临时变量的情况下以一个逗号分隔值获取列值【英文标题】:How to get column values in one comma separated value without using XML path and temporary variable 【发布时间】:2015-01-21 05:23:23 【问题描述】:

我有一个表“城市”,其中包含如下行:

ID  CityName
1   Chennai
2   Bangalore
3   Delhi
4   Mumbai

我想使用选择查询获得类似'Chennai,Bangalore,Delhi,Mumbai' 的结果。

当我在 Google 上搜索时,答案使用 XMLPATH 或临时变量。有什么方法可以在不使用这些的情况下做到这一点?

【问题讨论】:

您尚未标记 RDBMS。在 mysql 中使用 GROUP_CONCAT,在 Oracle 中使用 ListAgg,不幸的是,您需要在 Sql Server 中使用a hack,其中之一就是您似乎提到的STUFF / FOR XML PATH 【参考方案1】:
CREATE TABLE [dbo].[Cities](
    [Id] [int] NULL,
    [CityName] [varchar](50) NULL
) ON [PRIMARY]

INSERT INTO [dbo].[Cities]
           ([Id],[CityName])
     VALUES
           (1,'New York'),
           (2,'Miami'),
           (3,'Orlando')
GO

DECLARE @listStr VARCHAR(MAX)

SELECT @listStr = COALESCE(@listStr+',' ,'') + CityName
FROM Cities

SELECT @listStr

编辑: 另请阅读这篇文章,它包含几种方法,您可以通过这些方法实现您想要的。

http://www.sqlmatters.com/Articles/Converting%20row%20values%20in%20a%20table%20to%20a%20single%20concatenated%20string.aspx

【讨论】:

是否有可能避免@listStr 变量,并从选择查询中获取值。 没有。但是,您可以将其全部“包装”在一个存储过程中,如果这有助于您做您需要的事情。 是的,您提供的链接对我帮助很大。坦克为您提供建议@Y.S

以上是关于如何在不使用 XML 路径和临时变量的情况下以一个逗号分隔值获取列值的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 UINavigationController 的情况下以编程方式进入 rootViewController

如何在不使用 presentViewController 的情况下以模态方式呈现自定义视图?

如何在不使用 HTML 表单的情况下以编程方式将 POST 请求发送到 JSF 页面?

如何在不重新启动 Web 应用程序的情况下以编程方式使 JavaScript 和 CSS 包无效或刷新?

如何在不使用命令的情况下以编程方式关闭/重启 linux 机器(运行时)

如何在不使用外部主机的情况下以编程方式查找设备的外部 IP 地址?