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简单优雅非常聪明+从我的角度来看,我很聪明+从我这边