Замена регистра в SQL-запросе

#sql #sql-server #case

#sql #sql-сервер #случай

Вопрос:

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

 SELECT (CASE
    WHEN TableA.flag1 = 1 AND TableA.flag2 = 1 AND TableA.flag3 = 1 THEN 'CGR'
    WHEN TableA.flag1 = 1 AND TableA.flag2 = 1 THEN 'CG'
    WHEN TableA.flag1 = 1 AND TableA.flag3 = 1 THEN 'CR'
    WHEN TableA.flag2 = 1 AND TableA.flag3 = 1 THEN 'GR'
    WHEN TableA.flag1 = 1 THEN 'C'
    WHEN TableA.flag2 = 1 THEN 'G'
    WHEN TableA.flag3 = 1 THEN 'R'
    ELSE 'nothing'
END)
FROM TableA
  

Я работаю на сервере MSSQL 2000.

Ответ №1:

Вместо этого вы можете использовать left() .

 select left('C', T.flag1) 
       left('G', T.flag2) 
       left('R', T.flag3)
from TableA as T
  

Ответ №2:

Я не знаю, «лучше» ли это, но это более лаконично:

 SELECT ((CASE WHEN TableA.flag1 = 1 THEN 'C' ELSE '' END)  
        (CASE WHEN TableA.flag2 = 1 THEN 'G' ELSE '' END)  
        (CASE WHEN TableA.flag3 = 1 THEN 'R' ELSE '' END)
       )
FROM TableA;
  

Хорошо, это не совсем то же самое, потому что вы получаете '' вместо 'nothing' . Но я думаю, что пустая строка лучше справляется с представлением «без флагов», чем 'nothing' делает.

Ответ №3:

Попробуйте это:

 SELECT
CASE WHEN flag1 = 1 THEN 'C' ELSE '' END  
CASE WHEN flag2 = 1 THEN 'G' ELSE '' END  
CASE WHEN flag3 = 1 THEN 'R' ELSE '' END
FROM TABLEA
  

Ответ №4:

Может быть, вы могли бы использовать функцию и переместить этот оператор CASE в эту функцию