然后拆分值将值解析为名称

时间:2014-07-07 18:45:11

标签: sql-server-2008 tsql

我需要能够对可以包含多个值的列(下面)执行某些操作。 ' 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

我可以通过正确的联接来解决'天气'的值,注意它是第一列和第8列。

这是我迄今为止创建的用于解析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       Facebook, radio, commercial

1 个答案:

答案 0 :(得分:0)

我认为您可以用来实现这一目标的是:

  1. 分裂TVF功能 - http://msdn.microsoft.com/en-us/library/ms186755.aspx

  2. 交叉申请 - http://technet.microsoft.com/en-us/library/ms175156.aspx

  3. STUFF& FOR XML PATH - http://msdn.microsoft.com/en-us/library/ms188043.aspx& http://msdn.microsoft.com/en-us/library/ms190922.aspx

  4. 更进一步,你需要这样的东西: 请原谅我对子查询的大量使用。

    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