Sql 获取序列,忽略空值

Sql 获取序列,忽略空值,sql,hana,Sql,Hana,我有下表,在哪里?是空值 X14 X13 X12 X11 X10 X9 X8 X7 X6 9 ? ? ? ? 1 17 14 ? 8 9 ? ? ? 1 17 14 ? 1 8 9 ? ? 1 17 14 ? ? 1 8 1 9 1 17 14 ? ? ? 1 ? 9 1 17 14 ? ? ? ? ? ? 8 9 2

我有下表,在哪里?是空值

X14 X13 X12 X11 X10 X9  X8  X7  X6
9   ?   ?   ?   ?   1   17  14  ?
8   9   ?   ?   ?   1   17  14  ?
1   8   9   ?   ?   1   17  14  ?
?   1   8   1   9   1   17  14  ?
?   ?   1   ?   9   1   17  14  ?
?   ?   ?   ?   ?   8   9   2   14
我试图得到跨列的值序列[x(n),x(n-1),…],没有空值

预期结果如下:

y   x1  x2  x3
9   1   17  14
8   9   1   17
1   8   9   1
1   8   1   9
1   9   1   17
8   9   2   14
我试图执行COALESCE(X14,COALESCE(X13,…)),但是它没有很好地工作,因为它在找到的第一个非空值上卡住了

我能做些什么来跳过空值并得到正确的序列吗?
数据库是Hana,但不管怎样,请与我分享您的答案-我可能能够调整它。:)

最佳,

米格尔

很难把它们分成四列。可以将有效值连接到单个列表中:

select (case when x14 is not null then x14 || ';' else '' end) ||
       (case when x13 is not null then x13 || ';' else '' end) ||
       . . .

把它们分为四列是很困难的。可以将有效值连接到单个列表中:

select (case when x14 is not null then x14 || ';' else '' end) ||
       (case when x13 is not null then x13 || ';' else '' end) ||
       . . .

可能特定于SQL Server,但XML有一个技巧:

XML-默认情况下-只需将
值设为空

其他数据库(在您的hana中)将不支持此功能,但您可能会想到

这将带来您需要的结果

DECLARE @tbl TABLE(X14 INT,X13 INT,X12 INT,X11 INT,X10 INT,X9 INT,X8 INT,X7 INT,X6 INT);
INSERT INTO @tbl VALUES
 (9,NULL,NULL,NULL,NULL,1,17,14,NULL)
,(8,9,NULL,NULL,NULL,1,17,14,NULL)
,(1,8,9,NULL,NULL,1,17,14,NULL)
,(NULL,1,8,1,9,1,17,14,NULL)
,(NULL,NULL,1,NULL,9,1,17,14,NULL)
,(NULL,NULL,NULL,NULL,NULL,8,9,2,14);

WITH Casted AS
(SELECT
    (
        SELECT *
        FROM @tbl
        FOR XML PATH('row'),TYPE
    ) AS AsXml
)
SELECT r.value('*[1]','int') AS y
      ,r.value('*[2]','int') AS x1
      ,r.value('*[3]','int') AS x2
      ,r.value('*[4]','int') AS x3
FROM Casted
CROSS APPLY AsXml.nodes('/row') AS A(r)

可能特定于SQL Server,但XML有一个技巧:

XML-默认情况下-只需将
值设为空

其他数据库(在您的hana中)将不支持此功能,但您可能会想到

这将带来您需要的结果

DECLARE @tbl TABLE(X14 INT,X13 INT,X12 INT,X11 INT,X10 INT,X9 INT,X8 INT,X7 INT,X6 INT);
INSERT INTO @tbl VALUES
 (9,NULL,NULL,NULL,NULL,1,17,14,NULL)
,(8,9,NULL,NULL,NULL,1,17,14,NULL)
,(1,8,9,NULL,NULL,1,17,14,NULL)
,(NULL,1,8,1,9,1,17,14,NULL)
,(NULL,NULL,1,NULL,9,1,17,14,NULL)
,(NULL,NULL,NULL,NULL,NULL,8,9,2,14);

WITH Casted AS
(SELECT
    (
        SELECT *
        FROM @tbl
        FOR XML PATH('row'),TYPE
    ) AS AsXml
)
SELECT r.value('*[1]','int') AS y
      ,r.value('*[2]','int') AS x1
      ,r.value('*[3]','int') AS x2
      ,r.value('*[4]','int') AS x3
FROM Casted
CROSS APPLY AsXml.nodes('/row') AS A(r)

Plus1简单优雅Plus1简单优雅非常聪明+从我的角度来看,我很聪明+从我这边