获取序列,忽略空值

Getting a sequence, ignoring Nulls

我有以下 table,在哪里?是空值。

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,...)) 但效果不佳,因为它卡在找到的第一个非空值上。

我可以做些什么来跳过 Null 并获得正确的序列吗?
数据库是 Hana,但无论如何都要分享您的答案 - 我也许可以对其进行调整。 :)

最佳,
米格尔

将它们放在四个单独的列中很困难。您可以将有效值连接到一个列表中:

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

可能特定于 SQL 服务器,但 XML 有一个技巧:

XML - 默认情况下 - 仅省略 NULLs.

其他数据库(在你的情况下 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)
create column  TABLE xvals (X14 INT,X13 INT,X12 INT,X11 INT,X10 INT,X9 INT,X8 INT,X7 INT,X6 INT);

INSERT INTO xvals (
select 9,NULL,NULL,NULL,NULL,1,17,14,NULL from dummy UNION ALL
select 8,9,NULL,NULL,NULL,1,17,14,NULL from dummy UNION ALL
select 1,8,9,NULL,NULL,1,17,14,NULL from dummy UNION ALL
select NULL,1,8,1,9,1,17,14,NULL from dummy UNION ALL
select NULL,NULL,1,NULL,9,1,17,14,NULL from dummy UNION ALL
select NULL,NULL,NULL,NULL,NULL,8,9,2,14 from dummy 
);

with aschar as (
    select ifnull(to_varchar(X14)||'x', '') ||
           ifnull(to_varchar(X13)||'x', '') ||
           ifnull(to_varchar(X12)||'x', '') ||
           ifnull(to_varchar(X11)||'x', '') ||         
           ifnull(to_varchar(X10)||'x', '') ||         
           ifnull(to_varchar(X9)||'x', '') ||
           ifnull(to_varchar(X8)||'x', '') ||
           ifnull(to_varchar(X7)||'x', '') ||
           ifnull(to_varchar(X6)||'x', '')           
           cval
    from xvals)

select  SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 1)
            as y,
        SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 2)
            as x1,
        SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 3)
            as x2,
        SUBSTR_REGEXPR ('[[:digit:]]+' in cval occurrence 4)
            as x3

from aschar

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