Как вывести последнее непустое значение по строке?
Всем привет, есть таблица. Как вывести в отдельный столбец последнее не пустое значение по строке?
| id | Col 1 | Col 2 | Col 3 | Последнее не пустое |
|---|---|---|---|---|
| 1 | 1 | null | null | 1 |
| 2 | 1 | 5 | null | 5 |
| 3 | 2 | 2 | 6 | 6 |
| 4 | 5 | 1 | 7 | 7 |
Ответы (3 шт):
Автор решения: Vitaliy Zlobin
→ Ссылка
SELECT *, COALESCE(Col3, Col2, Col1) AS [Последнее не пустое]
FROM
(
VALUES (1, 1, NULL, NULL),
(2, 1, 5, NULL),
(3, 1, 2, 6),
(4, 5, 1, 7)
) AS MyTable(Id, Col1, Col2, Col3)
Автор решения: Andrew Nikolaev
→ Ссылка
Я могу такой вариант, но он для статичного набора колонок. Для динамического состава колонок потребуется динамический запрос.
CREATE TABLE #Test (ID INT IDENTITY, Col1 INT, Col2 INT, Col3 INT)
INSERT INTO #Test(Col1, Col2, Col3)
VALUES
(1, NULL, NULL),
(1, 5, NULL),
(1, 2, 6),
(5, 1, 7)
SELECT *,
LastNoEmpty = CASE
WHEN Col3 IS NOT NULL THEN Col3
WHEN Col2 IS NOT NULL THEN Col2
WHEN Col1 IS NOT NULL THEN Col1
ELSE NULL
END
FROM #Test t
DROP TABLE #Test
Автор решения: Yitzhak Khabinsky
→ Ссылка
Пожалуйста, попробуйте следующее решение.
Оно работает независимо от количества рассматриваемых столбцов. Без всякого динамического SQL.
Оно использует XML и XQuery. Если столбец имеет значение NULL, то при преобразовании в XML такой столбец пропускается в CROSS APPLY. Именно то, что нам нужно.
SQL
-- DDL и образец вставки данных, начало
DECLARE @tbl TABLE (id INT IDENTITY PRIMARY KEY, col_1 int, col_2 INT, col_3 int);
INSERT @tbl (col_1, col_2, col_3) VALUES
(1, NULL, NULL),
(1, 5, NULL),
(2, 2, 6),
(5, 1, 7);
-- DDL и образец вставки данных, конец
SELECT t1.*
, c.value('(/root/*[local-name()!="id"][last()]/text())[1]', 'INT') AS [Последнее не пустое]
FROM @tbl AS t1
CROSS APPLY (SELECT * FROM @tbl AS t2
WHERE t1.id = t2.id
FOR XML PATH(''), TYPE, ROOT('root')) AS t3(c);
Результат
+----+-------+-------+-------+---------------------+
| id | col_1 | col_2 | col_3 | Последнее не пустое |
+----+-------+-------+-------+---------------------+
| 1 | 1 | NULL | NULL | 1 |
| 2 | 1 | 5 | NULL | 5 |
| 3 | 2 | 2 | 6 | 6 |
| 4 | 5 | 1 | 7 | 7 |
+----+-------+-------+-------+---------------------+