#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 в эту функцию