用实际名称替换逗号分隔值

时间:2014-08-21 12:03:49

标签: c# asp.net sql-server-2008-r2

希望有人可以帮助我。我有一个表,其列的值可以是单个值,也可以是逗号分隔的值,它们是所有单个字母值。我希望能够(在演示级别)显示字母值的实际名称。这就是我想要的东西

原始结果

  PersonID    MentorList
  1           A
  2           K, L
  3           F

我想要什么

  PersonID    MentorList
  1           Big Brother/Big Sister
  2           Youth Motivators, Other Mentoring
  3           Gear Up

我已尝试过以下SQL语句,但它没有产生我想要的结果

  SELECT PersonID, REPLACE(REPLACE(MentorList, 'A', 'Big Brother/Big Sister'), 'B', 'Best Buddies') AS MentorList
  FROM Mentors  

我得到以下

  PersonID    MentorList
  1           Best Buddiesig Best Buddiesrother/Best Buddiesig Sister
  2           Youth Motivators, Other Mentoring
  3           Gear Up

正如您所看到的,查询语句将使用" Best Buddies"替换所有B。在第一行。如何让它以我想要的方式工作?

先谢谢...

2 个答案:

答案 0 :(得分:2)

如果您真的想要使用链式REPLACE,那么首先用不可能干扰的东西(例如#A,#B,......)替换每个字母,然后替换#A,#B,......通过您想要的实际扩展文本。

但为什么不单独访问这些值?为什么将它存储为串联字符串?

您可能应该有一个带有 MentorLetter 作为主键的表导师,以及一个字段MentorFullName。然后是一个包含( MentorLetter PersonId )的链接表,每人的导师数量超过导师数。

祝你好运。

答案 1 :(得分:0)

以下是我创建的一个示例,希望它可以帮助或指导您解决您的要求:

    -- create a temp table to store Letters and their description
    CREATE TABLE #Test1
    (
        ID int identity(1,1),
        Letter varchar(10),
        LetterDescription varchar(100)
    )

    GO 
    --Insert letter into temp table
    INSERT INTO #Test1(Letter, LetterDescription)
    SELECT 'K', 'Youth Motivators'

    INSERT INTO #Test1(Letter, LetterDescription)
    SELECT 'L', 'Other Mentoring'

    INSERT INTO #Test1(Letter, LetterDescription)
    SELECT 'F', 'Gear Up'

    --@Value is just a variable I use to test, your can replace this with a table
    DECLARE @Value VARCHAR(20)
    SELECT @Value = 'K'
    -- SELECT @Value = 'K,L'

    --Query to do the job 
    SELECT @Value AS  AcualChar, 
            CASE WHEN Desc2 IS NULL THEN Desc1 ELSE Desc1 + ','+ Desc2   END AS MentorList
    FROM 
    (
        SELECT T.LetterDescription AS Desc1, y.Desc2 FROM 
        (
            SELECT
            CASE WHEN Charindex(',', @Value) > 0 THEN  Substring(@Value, 1,Charindex(',', @Value)-1) ELSE @Value END AS Letter1

        ) AS L 
        JOIN  #Test1 AS T ON L.Letter1 = T.Letter 

         FULL OUTER JOIN 
        (
            SELECT T.LetterDescription AS Desc2 FROM 
            (
                SELECT
                CASE WHEN Charindex(',', @Value) > 0 THEN Substring(@Value, Charindex(',', @Value)+1, LEN(@Value))  ELSE '' END Letter2
            ) AS L 
            JOIN  #Test1 AS T ON L.Letter2 = T.Letter 
        ) as y ON 1=1
    ) X

    GO
    --Drop the temp table
    DROP TABLE #Test1