Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 拆分值,然后将值解析为名称_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 2008 拆分值,然后将值解析为名称

Sql server 2008 拆分值,然后将值解析为名称,sql-server-2008,tsql,Sql Server 2008,Tsql,我需要能够对包含多个值的列(下面)执行一些操作。“HearAboutEvent”列有多个由逗号分隔的值。这些值中的每一个都对应于另一个表中的一个条目。因此,11273的价值等于facebook,11274意味着无线电,11275意味着商业 我正在处理的数据如下所示: weather ID MemberID SubscriptionID DateEntered ParticipatedBefore ParticipatedBeforeCities WeatherDepen

我需要能够对包含多个值的列(下面)执行一些操作。“HearAboutEvent”列有多个由逗号分隔的值。这些值中的每一个都对应于另一个表中的一个条目。因此,11273的价值等于facebook,11274意味着无线电,11275意味着商业

我正在处理的数据如下所示:

weather ID  MemberID    SubscriptionID  DateEntered     ParticipatedBefore  ParticipatedBeforeCities    WeatherDependent    NonRefundable   TShirtSize  HearAboutEvent
Yes     24      18          1           2013-12-19          0                   NULL                        10950           10952           10957       11273, 11274, 11275
weather ID  MemberID    SubscriptionID  DateEntered     ParticipatedBefore  ParticipatedBeforeCities    WeatherDependent    NonRefundable   TShirtSize  HearAboutEvent
Yes     24      18          1           2013-12-19          0                   NULL                        10950           10952           10957       Facebook, radio, commercial
我能够进行适当的联接来解析“weather”的值,注意它是第一列和第八列

这是我迄今为止创建的查询,用于解析WeatherDependent的值:

SELECT CFS1.Name as 'weather', *
FROM FSM_CustomForm_693 t
LEFT JOIN FSM_CustomFormSelectOptions CFS1 ON CFS1.ID = t.WeatherDependent 
where t.ID = 24
最终,我需要让数据如下所示:

weather ID  MemberID    SubscriptionID  DateEntered     ParticipatedBefore  ParticipatedBeforeCities    WeatherDependent    NonRefundable   TShirtSize  HearAboutEvent
Yes     24      18          1           2013-12-19          0                   NULL                        10950           10952           10957       11273, 11274, 11275
weather ID  MemberID    SubscriptionID  DateEntered     ParticipatedBefore  ParticipatedBeforeCities    WeatherDependent    NonRefundable   TShirtSize  HearAboutEvent
Yes     24      18          1           2013-12-19          0                   NULL                        10950           10952           10957       Facebook, radio, commercial

我认为你可以通过以下方式来实现这一目标:

  • 分割TVF函数-

  • 交叉应用-

  • STUFF&用于XML路径-&

  • 再往前走一步,你需要这样的东西: 请原谅我大量使用子查询

    CREATE FUNCTION dbo.Split (@sep char(1), @s varchar(512))
    RETURNS table
    AS
    RETURN (
        WITH Pieces(pn, start, stop) AS (
          SELECT 1, 1, CHARINDEX(@sep, @s)
          UNION ALL
          SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
          FROM Pieces
          WHERE stop > 0
        )
        SELECT pn,
          SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
        FROM Pieces
      )
    GO
    
    SELECT 
    O.A,O.B,O.C,O.D,O.E,O.F,O.G,O.H,O.I,O.J,O.Stuffed
    FROM (
        SELECT
        * 
        ,STUFF((
            SELECT ', ' + Name
            FROM (
                SELECT 
                V.*
                ,Y.Name
                FROM (
                    SELECT 
                    'Yes' AS A
                    ,24 AS B
                    ,18 AS C
                    ,1 AS D
                    ,'2013-12-19' AS E
                    ,0 AS F
                    ,NULL AS G
                    ,10950 AS H
                    ,10952 AS I
                    ,10957 AS J
                    ,'11273, 11274, 11275' AS K
                )
                AS V
                CROSS APPLY dbo.Split(',',REPLACE(K,' ','')) AS P
                JOIN (
                    SELECT 11273 AS Id , 'Facebook' AS Name UNION ALL
                    SELECT 11274 AS Id , 'radio' AS Name UNION ALL
                    SELECT 11275 AS Id , 'commercial' AS Name
                )Y ON y.Id = p.s) ExampleTable
                FOR XML PATH('') 
                ), 1, 1, '' )
        AS [Stuffed]
        FROM (
            SELECT 
            V.*
            FROM (
                SELECT 
                'Yes' AS A
                ,24 AS B
                ,18 AS C
                ,1 AS D
                ,'2013-12-19' AS E
                ,0 AS F
                ,NULL AS G
                ,10950 AS H
                ,10952 AS I
                ,10957 AS J
                ,'11273, 11274, 11275' AS K
            )
            AS V
            CROSS APPLY dbo.Split(',',REPLACE(K,' ','')) AS P
            JOIN (
                SELECT 11273 AS Id , 'Facebook' AS Name UNION ALL
                SELECT 11274 AS Id , 'radio' AS Name UNION ALL
                SELECT 11275 AS Id , 'commercial' AS Name
            )Y ON y.Id = p.s
        )Z 
    ) O
    GROUP BY O.A,O.B,O.C,O.D,O.E,O.F,O.G,O.H,O.I,O.J,O.K,O.Stuffed
    

    您需要的是一个拆分字符串函数。有很多解决方案。这里有一个()。一旦将字符串分开并分成单独的行,就可以将其连接到另一个表中。