apachesparksQL如何使用子字符串/case语句/trim进行嵌套查询



SQL新手,尝试了解嵌套查询以及如何使用它们。我有一个子字符串、case语句和trim语句,我正试图将它们组合在一起,但不确定如何组合。必须首先完成子字符串,然后是case语句,然后是trim。这就是我目前所拥有的,但不确定如何让它发挥作用。代码是随机名称/表格,例如

SELECT dtXYZ.*
FROM 
(
SELECT dt,
SUBSTRING_INDEX(SUBSTRING_INDEX(dt, ..................... ) as lioness,
SUBSTRING_INDEX(SUBSTRING_INDEX(dt, .....................) as tiger,
SUBSTRING_INDEX(dt, .................) as bear  
FROM Animaltab
) dtXYZ
SELECT 
CASE WHEN length(bear) = 4 THEN bear
ELSE concat('0', bear)
END AS bear_corr,
CASE WHEN length(lion) = 7 THEN lioness
ELSE concat('0', lioness)
END AS lion_corr

trim(lion_corr) || '_' || trim(tiger) || '_' || trim(bear_corr) as new_imp_animal 

Spark支持CTEhttps://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-cte.html

即使使用databrics,这也能工作——参见Databricks和Spark 中的公共表表达式(CTE(

你可以把它们像这个一样嵌套

WITH dtXYZ(dt,lioness,tiger,bear()  AS  (    SELECT dt,
SUBSTRING_INDEX(SUBSTRING_INDEX(dt, ..................... ) as lioness,
SUBSTRING_INDEX(SUBSTRING_INDEX(dt, .....................) as tiger,
SUBSTRING_INDEX(dt, .................) as bear  
FROM Animaltab),
dtcorrected (dt,bear_corr,lion_corr,tiger) as (
SELECT
dt,
CASE WHEN length(bear) = 4 THEN bear
ELSE concat('0', bear)
END AS bear_corr,
CASE WHEN length(lion) = 7 THEN lioness
ELSE concat('0', lioness)
END AS lion_corr
,tiger
FROM dtXYZ)
SELECT
dt,
trim(lion_corr) || '_' || trim(tiger) || '_' || trim(bear_corr) as new_imp_animal  FROM dtcorrected

如果您习惯于在过程中排序,那么SQL的操作顺序可能会很棘手。正如nbk评论的那样,CTE或Common Table Expressions是最好的选择。CTE由关键字"with"定义,与嵌套的子查询非常相似(如果需要,可以编写嵌套的相同查询(,但更适合代码的嵌套结构不模拟数据嵌套的操作。如果我要连接每个需要独立分组或筛选的表,我总是使用CTE。括号中的SQL本质上创建了一个视图,而外部的SQL是用于创建结果集的第二个高阶select语句。如果我使用分层数据(父、子、孙(,我会使用查询中的嵌套来遵循该路径,但通常情况下,CTE更容易组织您的想法。这是如何工作的:

with dtXYZ as
(
SELECT dt,
SUBSTRING_INDEX(SUBSTRING_INDEX(dt, ..................... ) as lioness,
SUBSTRING_INDEX(SUBSTRING_INDEX(dt, .....................) as tiger,
SUBSTRING_INDEX(dt, .................) as bear  
FROM Animaltab
)
SELECT 
CASE WHEN length(bear) = 4 THEN bear
ELSE concat('0', bear)
END AS bear_corr,
CASE WHEN length(lion) = 7 THEN lioness
ELSE concat('0', lioness)
END AS lion_corr,
trim(lion_corr) || '_' || trim(tiger) || '_' || trim(bear_corr) as new_imp_animal 
from
dtXYZ

就"操作顺序"而言,select语句中的case语句和函数可以被select语句的其他部分作为输入引用。当你使用"如果"的想法来解决不合逻辑或导致错误的情况时,事情可能会变得棘手。不过,除此之外,我对一个精选集的许多部分相互引用没有任何问题。这是测试嵌套函数的一种很好的方法。

最新更新