Замените разделенные запятыми значения фактическими именами

1

Надеюсь, кто-то может мне помочь. У меня есть таблица, в которой есть столбец со значениями, которые либо имеют одно значение, либо значение, разделенное запятой, и все они являются однобуквенными значениями. То, что я хочу выполнить, чтобы иметь возможность (на уровне презентации) отображать фактические имена для буквенных значений. Вот что я хочу

Оригинальные результаты

  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

Как вы можете видеть, оператор запроса заменяет все Bs "Лучшими друзьями" в первой строке. Как мне заставить его работать так, как я хочу?

Спасибо в advace...

  • 3
    Обо всем по порядку. Вы спроектировали колонку MentorList? Если бы у вас была таблица MentorNames и отношения с таблицей Mentors, это было бы гораздо лучшим способом, и вам не нужно ничего заменять или хранить «закодированные» данные с камерами.
  • 1
    Рассмотрите комментарий Reniuz, вы также можете использовать оператор SELECT CASE для замены
Показать ещё 6 комментариев
Теги:
sql-server-2008-r2

2 ответа

2

Если вы действительно хотите пойти с цепочкой REPLACE, сначала замените каждую букву на то, что не имеет шансов вмешиваться (например, #A, #B,...), а затем замените #A, #B,... фактическим расширенный текст, который вы хотите.

Но почему у вас нет этих значений, доступных отдельно? зачем хранить это как объединенную строку?

Вероятно, вы должны иметь Table Mentor с MentorLetter в качестве первичного ключа и поле MentorFullName. Затем таблица ссылок с (MentorLetter, PersonId), чтобы иметь больше, чем Mentor per Person.

Удачи.

  • 0
    Я думал о том же, но я не был тем, кто изначально проектировал таблицу (в которой более 275 тысяч строк) ...
  • 0
    Если вы не хотите трогать текущую структуру таблиц, вы можете создать представление для этого. Вероятно, не лучше с точки зрения производительности, но сделает ваши запросы менее уродливыми.
Показать ещё 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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню