Как обновить несколько строк, используя более одного оператора CASE на SQL Server? - PullRequest
2 голосов
/ 14 февраля 2020

Как я могу использовать более одного CASE для обновления моих строк в моей таблице? Я пытался написать скрипт по-разному, но я уверен, что синтаксис неправильный. Любая идея, где ошибка?

UPDATE NameToSplit
SET Aliases = CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 4 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-')END;
              CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 5 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 6, 0, '-')END;
              CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 6 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 7, 0, '-')END;
              CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 7 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 8, 0, '-')END;
             CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 8 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 9, 0, '-')END;
             CASE LEN(Alias)
    WHEN CHARINDEX('.', Alias) + 9 THEN Alias
    ELSE STUFF(Alias, CHARINDEX('.', Alias) + 10, 0, '-')END;

Результаты должны быть такими:

        Names                              Alias                  Aliases       
    -------------------------------------------------------------------------
    idealink.core.usergroup            core.usergroup         core.user-group
    idealink.core.userloginhistory     core.userloginhistory  core.user-loginhistory
   idealink.core.challengecategories   core.challengecategories core.challenge-categories
   idealink.core.activitydetails       core.activitydetails    core.activity-details

Длина слова после (основной) разные, поэтому мне нужно было создать разные случаи, чтобы получить все из них.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2020

Не думайте, что вы сможете добиться желаемого результата в случае. Поскольку длины вне мира недостаточно, как вы узнаете, когда делить только на длину, лучше использовать сравнение строк.

 UPDATE NameToSplit
    SET Aliases = CASE 
                     WHEN  ALIAS LIKE 'core.user%'
                        THEN STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-') 
                    WHEN ALIAS LIKE 'core.challenge%'
                        THEN STUFF(Alias, CHARINDEX('.', Alias) + 10, 0, '-') 
                WHEN  ALIAS LIKE 'core.idea%'
                        THEN STUFF(Alias, CHARINDEX('.', Alias) + 5, 0, '-')    
                 -- .....
                 WHEN ALIAS LIKE 'core.%' 
                 THEN ALIAS --keep it at the end
                 END

Если псевдоним только "core.user", то ELSE будет сделать это работа и псевдонимы = псевдоним

0 голосов
/ 14 февраля 2020

По моему скромному мнению, ваша проблема не в утверждении CASE. Основная проблема, с которой вы столкнулись, заключается в том, как разбить строку, содержащую два или более слов, только на две строки.

Например, вам нужно найти способ разбить строки следующим образом:

usergroup           user group (2 words split into two strings)
userloginhistory    user loginhistory (3 words split into two strings)
challengecategories challenge categories (2 words split into two strings)
activitydetails     activity details (2 words split into two strings)

Итак, как-то нужно найти общие критерии. Например, по крайней мере, вам нужен список всех возможных начальных слов в ваших таблицах. В приведенном выше примере эти начальные слова: пользователь , вызов и активность . Таким образом, вы можете написать некоторый код для вставки da sh сразу после одного из них.

Чтобы дать решение кода, пожалуйста, дайте мне знать, возможно ли получить этот список слов для вы (я бы, вероятно, положил их во временную таблицу и использовал бы их оттуда).

0 голосов
/ 14 февраля 2020

Согласно документам , ваш ELSE находится не в том месте. Синтаксис будет выглядеть следующим образом:

CASE ProductLine  
  WHEN 'R' THEN 'Road'  
  WHEN 'M' THEN 'Mountain'  
  WHEN 'T' THEN 'Touring'  
  WHEN 'S' THEN 'Other sale items'  
  ELSE 'Not for sale'  
END,

В конечном итоге он будет действовать как оператор switch, где последующие операторы when сделают утверждение, только если предыдущие операторы подтвердили ложь.

...