有没有一种干净的方法来复制SQL中的顺序变量赋值?

时间:2015-12-10 02:45:49

标签: sql teradata

我正在尝试在SQL中复制SAS进程,并且在查找模拟顺序变量赋值的简洁方法时遇到了一些麻烦。

例如(其中a,b和c是字段):

IF a > b THEN
    a = '1'
ELSE a = '2'
END IF
If a = '2' AND b = '3' THEN 
    a = '1' AND
    b = '1'
END IF
IF a = '1' AND b = '2' THEN
    c = 'yady-yada-yada'
END IF

这是一个非常简单的例子,理想情况下我试图突破逻辑,但这非常复杂。我知道我可以使用虚拟别名和case语句,或一系列UPDATE。

例如:

SELECT 
 CASE 
  WHEN a > b THEN '1'
  ELSE '2'
 END as a0
,CASE 
  WHEN a0 = '2' AND b = '3' THEN '1'
  ELSE a0
 END as a1
,CASE 
  WHEN a0 = '2' AND b = '3' THEN '1'
  ELSE b
 END as b0
,CASE 
  WHEN a1 = '2' AND b0 = '3' THEN 'yada-yada-yada'
  ELSE NULL
 END as c
....
FROM someTable

虽然这种方法存在“塑料步骤内存不足”错误的问题。

我觉得必须有一种更清晰的方法来解决这个问题,但在任何其他语言中,逻辑非常简单,但它在SQL中变成了一场噩梦。

1 个答案:

答案 0 :(得分:1)

可能最简单的方法是使用一系列CTE:

with t1 as (
      select t.*,
             (case when a > b then '1' else '2' end) as a
      from sometable t
     ),
     t2 as (
      select . . .,
             (case when a = '2' and b = '3' then '1' else a end) as a,
             (case when a = '2' and b = '3' then '1' else b end) as b
      from t1
     ),
     t3 as (
      select . . .
             (case when a = '1' and b = '2' then 'yady-yada-yada' end) as c
      from t2
     )
select *
from t3;

但是,我建议您尝试简化逻辑。 SQL并不像一系列条件语句那么简单。但是,通常有一些简单的方法,而不是将该逻辑转换为一系列(基本上)嵌套的case语句。