【问题标题】:Concatenate comma separated strings using STUFF使用 STUFF 连接逗号分隔的字符串
【发布时间】:2021-05-18 03:47:43
【问题描述】:

我想连接逗号分隔的字符串。我有一个查询,我在哪里使用该函数来获取员工。

目前,我使用[dbo].fn_fullname(A.REFNO) 作为员工来获取员工,但如果cast(S.SCH_NO as varchar) as ReferenceIdentifier 的计数大于1,我想包含一些条件,然后连接该值。但不确定如何在视图本身内部实现。

这里我尝试使用STUFF 进行连接。

这里是查询:

    Alter View vw_TestDB
    AS
       select 
           NEWID() as UniqueKey,
           P.ID as Number, 
           cast(S.SCH_NO as varchar) as ReferenceIdentifier, 
           cast(S.START_D as datetime2) as StartDateTime,                                      
            staff = STUFF((
            SELECT ',' + [dbo].fn_fullname(A.REFNO)
            FROM [dbo].[vw_TESTDB]
            FOR XML PATH('')
            ), 1, 1, '')
        FROM [dbo].[vw_TestDB]
        group by ReferenceIdentifier
        having count(ReferenceIdentifier)>1,
    
         [dbo].fn_fullname(A.REFNO) as Staff,
         
    from [dbo].V_SCHEDULES S WITH (NOLOCK)
    inner join [dbo].V_PAT P WITH (NOLOCK) on P.PAT_REFNO = S.PAT_REFNO

这里是函数:

    ALTER FUNCTION [dbo].[fn_fullname]
    (
        @refno as numeric(10, 0)
    )
    RETURNS varchar(100)
    AS
    BEGIN
        DECLARE @name     as varchar(100)

        SELECT  @name = Stuff(Coalesce(' ' + 
                CASE 
                    WHEN proca.TITLE_REFNO = 3104 
                        THEN NULL
                    ELSE
                        NullIf(dbo.fn_rfval(proca.TITLE_REFNO), '')
                END,
                '') +
                Coalesce(' ' + proca.forename, '') +
                Coalesce(' ' + proca.surname, ''),
                1, 
                1,
                '') 
        FROM    dbo.v_carers_active proca (nolock)
        WHERE   refno = @refno

        return @name
    END

    GO

这里是示例数据

UniqueKey Number ReferenceIdentifier StartDateTime staff
70DB83D1-2900-4CF1-9CC4-CA6948AC0E91 A4286 2182823 2015-03-26 08:00:00.0000000 Ms S Taylor
310745CB-4724-4724-A5F0-7D9088317E58 A4286 2182823 2015-03-26 08:00:00.0000000 Ms D Kirkpatrick
CA6DDB25-AADD-4FC1-ABAA-2AF84016E6E5 A4286 2182834 2015-03-19 08:00:00.0000000 Ms D Kirkpatrick
6A3C0A3B-EAA3-4523-B4FD-2882E2C02B4A A4286 2182844 2015-03-30 08:00:00.0000000 Mrs Nel McKinnon
6399662A-EC4D-4993-8D4F-0BC396D12C2C A4286 2182844 2015-03-30 08:00:00.0000000 Ms Deb Kirkpatrick

预期输出

UniqueKey Number ReferenceIdentifier StartDateTime staff
70DB83D1-2900-4CF1-9CC4-CA6948AC0E91 A4286 2182823 2015-03-26 08:00:00.0000000 Ms S Taylor,Ms D Kirkpatrick
CA6DDB25-AADD-4FC1-ABAA-2AF84016E6E5 A4286 2182834 2015-03-19 08:00:00.0000000 Ms D Kirkpatrick
6A3C0A3B-EAA3-4523-B4FD-2882E2C02B4A A4286 2182844 2015-03-30 08:00:00.0000000 Mrs Nel McKinnon,Ms Deb Kirkpatrick

【问题讨论】:

  • STUFF 不连接。 FOR XML PATH('') 正在完成所有繁重的工作。 STUFF 只是删除了最后一个字符串的前导逗号。
  • 这和你之前的问题一样,现在删除了。您需要改进上次要求的任何内容。
  • @DaleK,你能告诉我一种方法吗?我不明白。
  • @Damien_The_Unbeliever,你能告诉我它是如何实现的吗?
  • Ms D Kirkpatrick UniqueKey of 310745CB-4724-4724-A5F0-7D9088317E58 发生了什么?

标签: sql-server tsql stuff


【解决方案1】:

不太明白你想要什么。根据样本数据和预期输出,您似乎想要

SELECT  t.[Number], t.[ReferenceIdentifier], t.[StartDatetime],
        STUFF (
                 (SELECT ',' + [dbo].fn_fullname(x.REFNO)
                  FROM   yourtable AS x
                  WHERE  x.[Number] = t.[Number]
                  AND    x.[ReferenceIdentifier] = t.[ReferenceIdentifier]
                  AND    x.[StartDatetime] = t.[StartDatetime]
                  FOR XML PATH('')),
               1, 1, '') AS Staff
FROM    yourtable t
GROUP BY t.[Number], t.[ReferenceIdentifier], t.[StartDatetime]
HAVING COUNT(*) > 1

【讨论】:

  • 感谢您的回答。我可以在 STUFF 函数中使用相同的视图名称吗?
  • 如果您将此查询用于视图,则不会。您需要引用基表名称。而不是视图名称
  • 如果您使用的是SQL Server 2017,请查看STRING_AGG docs.microsoft.com/en-us/sql/t-sql/functions/…
  • 嗨@Squirrel,还有一件事要问。如您所见,我在 ` STUFF ( (SELECT ',' + [dbo].fn_fullname(x.REFNO) FROM yourtable AS x WHERE x.[Number] = t.[Number] AND x.[ ReferenceIdentifier] = t.[ReferenceIdentifier] AND x.[StartDatetime] = t.[StartDatetime] FOR XML PATH('')), 1, 1, '') AS Staff。我可以在您的查询中使用dbo.v_carers_active proca 代替表名吗?如果您也可以在答案中使用我的函数查询表,那就太好了。
  • 坦率地说,我不知道。我不知道像 REFNONumber 等这些列来自哪个表。我在这里展示的是使用FOR XML PATH 进行类似的典型查询。
猜你喜欢
  • 2017-09-29
  • 2015-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多