Как вывести последнее непустое значение по строке?

Всем привет, есть таблица. Как вывести в отдельный столбец последнее не пустое значение по строке?

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 |
+----+-------+-------+-------+---------------------+
→ Ссылка