我正在尝试在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中变成了一场噩梦。
答案 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
语句。