首页 > 解决方案 > 在以下 CASE WHEN 语句中使用 SELECT AS 别名 - Spark SQL

问题描述

似乎我无法执行以下操作,因为它无法识别 CASE 逻辑中有价值的 StageCodeTableB。但这很奇怪,因为我曾经在不同的练习中做到过。有什么方法可以访问 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

标签: sqlapache-spark-sqldatabricks

解决方案


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;

推荐阅读