Snowflake SQL 中 T-SQL CROSS APPLY 的等效项

问题描述 投票:0回答:1

我有一个包含 4 列的表格:状态、笔、铅笔、纸,最后 3 列显示二进制值(1 或 0)。

State  Pens   Pencils   Papers
NY     1      0         1
CA     1      1         1
TX     0      0         1

下面的代码可以在 T-SQL 中运行,但我在将其转换为 Snow SQL 时遇到问题。

SELECT X.State, Result.Combination
FROM Dataset X
CROSS APPLY (SELECT 'Pens' AS Val WHERE X.Pens = 1 UNION ALL SELECT NULL) Pens
CROSS APPLY (SELECT 'Pencils' AS Val WHERE X.Pencils = 1 UNION ALL SELECT NULL) Pencils
CROSS APPLY (SELECT 'Papers' AS Val WHERE X.Papers = 1 UNION ALL SELECT NULL) Papers
CROSS APPLY (SELECT CONCAT_WS(',', Pens.Val, Pencils.Val, Papers.Val) AS Combination) Result
WHERE Result.Combination > ''
ORDER BY X.State, LEN(Result.Combination), Result.Combination

当每个列名称的输出等于 1 (TRUE) 时,我尝试返回 Snow SQL 中所有列名称组合的列表。

例如,结果表应显示纽约州的以下 3 行:

State  Combination
NY     Pens
NY     Papers
NY     Pens, Papers 

我尝试了 CROSS JOIN LATERAL,但它抛出错误“无法评估不支持的子查询类型”,而其他方法(例如将其分解为 CTE)也无济于事。也许我错过了一些东西。

sql t-sql snowflake-cloud-data-platform
1个回答
0
投票

“无效子查询”是由于

UNION
造成的。另请注意,
CONCAT_WS
的行为有所不同:对于 T-SQL,它会忽略
NULL
,对于 Snowflake,任何
NULL
都会导致
NULL
返回。

我的尝试是使用

UNPIVOT
LISTAGG

WITH Dataset AS
(
    SELECT *
    FROM (VALUES
        ('NY', 1, 0, 1),
        ('CA', 1, 1, 1),
        ('TX', 0, 0, 1)) X(State,Pens,Pencils,Papers)
)
SELECT State,LISTAGG(ItemType, ',') Items
FROM Dataset
    UNPIVOT(Item FOR ItemType IN (Pens, Pencils, Papers))
WHERE Item = 1
GROUP BY State
© www.soinside.com 2019 - 2024. All rights reserved.