Несмотря на то, что ответ @ughai поможет вам получить то, что вам нужно, но он не сможет объяснить вам, как работает оператор CASE в sql.
Надеюсь, что мой образец проведет вас так, как это работает с несколькими инструкциями «КОГДА».
Давайте рассмотрим ваш стол.
;WITH cte (account, period01, period02, period03, period04)
AS
(
SELECT
1111, NULL, NULL, NULL, NULL
UNION ALL
SELECT
1112, 782, NULL, NULL, NULL
UNION ALL
SELECT
1113, NULL, NULL, NULL, 345
UNION ALL
SELECT
1114, 765, 882, 67, 321
)
Ниже приведена общая ошибка, которую каждый делает для достижения нашего результата.
SELECT
account,
period01,
period02,
period03,
period04,
CASE
WHEN period01 IS NOT NULL THEN '01'
WHEN period02 IS NOT NULL THEN '02'
WHEN period03 IS NOT NULL THEN '03'
WHEN period04 IS NOT NULL THEN '04'
ELSE NULL END AS [accoutperiod]
FROM
cte
Этот запрос даст вам следующий результат:
╔═════════╦══════════╦══════════╦══════════╦══════════╦══════════════╗
║ account ║ period01 ║ period02 ║ period03 ║ period04 ║ accoutperiod ║
╠═════════╬══════════╬══════════╬══════════╬══════════╬══════════════╣
║ 1111 ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║
║ 1112 ║ 782 ║ NULL ║ NULL ║ NULL ║ 01 ║
║ 1113 ║ NULL ║ NULL ║ NULL ║ 345 ║ 04 ║
║ 1114 ║ 765 ║ 882 ║ 67 ║ 321 ║ 01 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
С первым оператором в случае имеет КОГДА period01 IS NOT NULL THEN '01', Таким образом, утверждение получает успех с первой попытки и выполнено .
Теперь переупорядочу инструкцию WHEN в обратном порядке.
SELECT
account,
period01,
period02,
period03,
period04,
CASE
WHEN period04 IS NOT NULL THEN '04'
WHEN period03 IS NOT NULL THEN '03'
WHEN period02 IS NOT NULL THEN '02'
WHEN period01 IS NOT NULL THEN '01'
ELSE NULL END AS [accoutperiod]
FROM
cte
Этот запрос даст вам следующий результат:
╔═════════╦══════════╦══════════╦══════════╦══════════╦══════════════╗
║ account ║ period01 ║ period02 ║ period03 ║ period04 ║ accoutperiod ║
╠═════════╬══════════╬══════════╬══════════╬══════════╬══════════════╣
║ 1111 ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║
║ 1112 ║ 782 ║ NULL ║ NULL ║ NULL ║ 01 ║
║ 1113 ║ NULL ║ NULL ║ NULL ║ 345 ║ 04 ║
║ 1114 ║ 765 ║ 882 ║ 67 ║ 321 ║ 04 ║
╚═════════╩══════════╩══════════╩══════════╩══════════╩══════════════╝
Что я понял, для случая утверждения когда значение соответствует выражению, оператор СЛУЧАЯ будет выполнять соответствующие заявления, а не оценивать любого в дальнейшем. Таким образом, в этом случае, если период с 1 по 4-й период имеет значение, оператор case всегда будет возвращен 01. – user1902849
Просто измените порядок инструкций 'WHEN', начиная с period04 и заканчивая period01 - это должно сделать трюк. – Dan
@jpw и Dan Я согласен. Формулировка в вопросе меня смутила :) – ughai