在下面的CASE WHEN语句-Spark SQL中使用SELECT AS别名



我似乎无法执行以下操作,因为它无法识别StageCodeTableB在CASE逻辑中的价值。但这很奇怪,因为我在另一个练习中做过一次。有什么方法可以访问CASE逻辑中的StageCodeTableB变量吗?

您可以在CASE逻辑中引用tableB.stageCode,但如果您在SELECT阶段进行了一些转换,则需要在每个WHEN语句中一次又一次地重写这些转换。。。

%sql
DROP TABLE IF EXISTS database.tableA;
CREATE TABLE database.tableA PARQUET AS
SELECT 
CAST(tableB.stageCode AS STRING) AS StageCodeTableB,
CASE
WHEN StageCodeTableB = '33' THEN 1
ELSE NULL
END AS StageCodeTableBSCORE
FROM database.tableB AS tableB

SparkSQL支持公共表表达式(CTE(,即使使用了CTAS(CREATE Table AS(,也可以将它们一起使用。一个简单的例子;

%sql
DROP TABLE IF EXISTS sparkDb.tableA; 
CREATE TABLE IF NOT EXISTS sparkDb.tableA USING PARQUET 
AS
WITH cte AS  (
SELECT
stageCode,
CAST(tableB.stageCode AS STRING) AS StageCodeTableB
FROM sparkDb.tableB AS tableB
)
SELECT *,
CASE
WHEN StageCodeTableB = '33' THEN 1
ELSE NULL
END AS StageCodeTableBSCORE
FROM cte;
SELECT * FROM tableA;

最新更新