sql - 在以下 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
解决方案
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;
推荐阅读
- c - 带有 & 操作的 uint64_t 变量
- angular - 角度 2 类型脚本错误 - TS2322
- unity3d - UI ButtonCallBack 和恢复按钮不起作用?
- drop-down-menu - 引导选择在下拉菜单中无法正常工作
- django - 在 Django 模板中将字符串转换为整数
- scala - Apache TIKA 中的 PDF 解析
- reactjs - 覆盖材质 UI MuiInput
- php - 使用 ON DUPLICATE KEY UPDATE 正确处理 PHP 表单数组?
- amazon-web-services - 如何从 AWS Lambda 的 DynamoDB 列表中删除元素?
- python - 将 cython cdef 扩展数组设置为零