【问题标题】:Remove additional comma without knowing the length of the string在不知道字符串长度的情况下删除额外的逗号
【发布时间】:2017-02-12 08:26:44
【问题描述】:

我的桌子

我的表

+----+-------+---------------+
| Id | Title | DependencyIds |
+----+-------+---------------+

DependentIds 包含类似14;77;120 的值。


MyDependentTable

+--------------+------+
| DependencyId | Name |
+--------------+------+

背景

我必须从MyTable 中选择数据,MyDependentTable 中的每个依赖项都用逗号分隔。

预期输出:

+---------+-------------------------------------+
| Title   | Dependencies                        |
+---------+-------------------------------------+
| Test    | ABC, One-two-three, Some Dependency |
+---------+-------------------------------------+
| Example | ABC                                 |
+---------+-------------------------------------+

我的查询

SELECT t.Title,
    (SELECT ISNULL((
        SELECT DISTINCT
        (
            SELECT dt.Name + '',
                   CASE WHEN DependencyIds LIKE '%;%' THEN ', ' ELSE '' END AS [text()]
            FROM MyDependentTable dt
            WHERE dt.DependencyId IN (SELECT Value FROM dbo.fSplitIds(t.DependencyIds, ';'))
            ORDER BY dt.DependencyId
            FOR XML PATH('')
        )), '')) Dependencies
FROM dbo.MyTable t

问题描述

查询有效,但在有多个依赖项时添加了一个额外的逗号:

+---------+---------------------------------------+
| Title   | Dependencies                          |
+---------+---------------------------------------+
| Test    | ABC, One-two-three, Some Dependency,  |
+---------+---------------------------------------+
| Example | ABC                                   |
+---------+---------------------------------------+

我无法使用SUBSTRING(ISNULL(...,因为我无法访问字符串的长度,因此我无法设置SUBSTRING 的长度。

有没有可能去掉那个不必要的额外逗号?

【问题讨论】:

    标签: sql sql-server tsql sql-server-2014


    【解决方案1】:

    通常对于 Sql Server 中的组连接,人们会添加 leading 逗号并使用STUFF 函数将其删除,但即使这样看起来也很难看。

    Outer Apply 方法看起来很不错,而不是 correlated sub-query。在这种方法中,我们不必用ISNULLSTUFF 包装SELECT 查询

    SELECT DISTINCT t.title, 
                    Isnull(LEFT(dependencies, Len(dependencies) - 1), '') 
                    Dependencies 
    FROM   dbo.mytable t 
           OUTER apply (SELECT dt.NAME + ',' 
                        FROM   mydependenttable dt 
                        WHERE  dt.dependencyid IN (SELECT value 
                                                   FROM 
                               dbo.Fsplitids(t.dependencyids,';')) 
                        ORDER  BY dt.dependencyid 
                        FOR xml path('')) ou (dependencies) 
    

    【讨论】:

      【解决方案2】:

      这里是使用STUFF的方法。

      SELECT  t.Title
             ,STUFF((SELECT ', ' + CAST(dt.Name AS VARCHAR(10)) [text()]
                     FROM MyDependentTable dt
                     WHERE dt.DependencyId IN (SELECT Value FROM dbo.fSplitIds(t.DependencyIds, ';'))
                     ORDER BY dt.DependencyId
                     FOR XML PATH(''), TYPE).value('.','NVARCHAR(MAX)'),1,2,' ') Dependencies
      FROM dbo.MyTable  t
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-24
        • 1970-01-01
        • 2023-03-10
        • 2014-01-02
        • 2019-11-20
        相关资源
        最近更新 更多