select 生成列的 sql 别名
tsql alias for select generated column
在 T-SQL 中,我需要为计算值分配一个别名,以便在 CASE 子句中使用它。
SELECT
RUT,
(11 - ((SUBSTRING(RUT, 1, 1) * 3
+ SUBSTRING(RUT, 2, 1) * 2
+ SUBSTRING(RUT, 3, 1) * 7
+ SUBSTRING(RUT, 4, 1) * 6
+ SUBSTRING(RUT, 5, 1) * 5
+ SUBSTRING(RUT, 6, 1) * 4
+ SUBSTRING(RUT, 7, 1) * 3
+ SUBSTRING(RUT, 8, 1) * 2) % 11)) AS VerifDigit,
CASE
WHEN VerifDigit = 10 THEN 'K'
WHEN VerifDigit = 11 THEN '0'
ELSE VerifDigit
END
FROM
Citizen
您不能在定义别名的 select 子句中使用别名。这里的一种解决方法是子查询,例如
WITH cte AS (
SELECT
RUT,(11 - ((SUBSTRING(RUT,1,1)*3
+ SUBSTRING(RUT,2,1)*2
+ SUBSTRING(RUT,3,1)*7
+ SUBSTRING(RUT,4,1)*6
+ SUBSTRING(RUT,5,1)*5
+ SUBSTRING(RUT,6,1)*4
+ SUBSTRING(RUT,7,1)*3
+ SUBSTRING(RUT,8,1)*2)%11)) AS VerifDigit
FROM Citizen
)
SELECT
VerifDigit,
CASE
WHEN VerifDigit = 10 THEN 'K'
WHEN VerifDigit = 11 THEN '0'
ELSE VerifDigit
END
FROM cte;
您还可以将 CROSS APPLY 与 VALUES 一起使用来计算结果,然后在您的 CASE 语句中引用该值,例如...
SELECT
RUT,
xa.VerifDigit,
CASE
WHEN xa.VerifDigit = '10' THEN 'K'
WHEN xa.VerifDigit = '11' THEN '0' -- this will never occur
ELSE xa.VerifDigit
END
FROM
Citizen
CROSS APPLY (VALUES(cast((11 - (( substring(RUT, 1, 1) * 3
+ SUBSTRING(RUT, 2, 1) * 2
+ SUBSTRING(RUT, 3, 1) * 7
+ SUBSTRING(RUT, 4, 1) * 6
+ SUBSTRING(RUT, 5, 1) * 5
+ SUBSTRING(RUT, 6, 1) * 4
+ SUBSTRING(RUT, 7, 1) * 3
+ SUBSTRING(RUT, 8, 1) * 2) % 11))
AS char(2)))) xa(VerifDigit)
不过有几点值得指出...
- 如果要将结果 (VerifDigit) 替换为 'K',则需要将结果 (VerifDigit) 转换为字符数据类型,否则 CASE 将因数据转换而失败;这在示例中显示。
- 模(%)11的结果永远不会是11;除以 11 的余数将在 0 到 10 之间,因此第二个 CASE/WHEN 将 永远不会 被击中。
在 T-SQL 中,我需要为计算值分配一个别名,以便在 CASE 子句中使用它。
SELECT
RUT,
(11 - ((SUBSTRING(RUT, 1, 1) * 3
+ SUBSTRING(RUT, 2, 1) * 2
+ SUBSTRING(RUT, 3, 1) * 7
+ SUBSTRING(RUT, 4, 1) * 6
+ SUBSTRING(RUT, 5, 1) * 5
+ SUBSTRING(RUT, 6, 1) * 4
+ SUBSTRING(RUT, 7, 1) * 3
+ SUBSTRING(RUT, 8, 1) * 2) % 11)) AS VerifDigit,
CASE
WHEN VerifDigit = 10 THEN 'K'
WHEN VerifDigit = 11 THEN '0'
ELSE VerifDigit
END
FROM
Citizen
您不能在定义别名的 select 子句中使用别名。这里的一种解决方法是子查询,例如
WITH cte AS (
SELECT
RUT,(11 - ((SUBSTRING(RUT,1,1)*3
+ SUBSTRING(RUT,2,1)*2
+ SUBSTRING(RUT,3,1)*7
+ SUBSTRING(RUT,4,1)*6
+ SUBSTRING(RUT,5,1)*5
+ SUBSTRING(RUT,6,1)*4
+ SUBSTRING(RUT,7,1)*3
+ SUBSTRING(RUT,8,1)*2)%11)) AS VerifDigit
FROM Citizen
)
SELECT
VerifDigit,
CASE
WHEN VerifDigit = 10 THEN 'K'
WHEN VerifDigit = 11 THEN '0'
ELSE VerifDigit
END
FROM cte;
您还可以将 CROSS APPLY 与 VALUES 一起使用来计算结果,然后在您的 CASE 语句中引用该值,例如...
SELECT
RUT,
xa.VerifDigit,
CASE
WHEN xa.VerifDigit = '10' THEN 'K'
WHEN xa.VerifDigit = '11' THEN '0' -- this will never occur
ELSE xa.VerifDigit
END
FROM
Citizen
CROSS APPLY (VALUES(cast((11 - (( substring(RUT, 1, 1) * 3
+ SUBSTRING(RUT, 2, 1) * 2
+ SUBSTRING(RUT, 3, 1) * 7
+ SUBSTRING(RUT, 4, 1) * 6
+ SUBSTRING(RUT, 5, 1) * 5
+ SUBSTRING(RUT, 6, 1) * 4
+ SUBSTRING(RUT, 7, 1) * 3
+ SUBSTRING(RUT, 8, 1) * 2) % 11))
AS char(2)))) xa(VerifDigit)
不过有几点值得指出...
- 如果要将结果 (VerifDigit) 替换为 'K',则需要将结果 (VerifDigit) 转换为字符数据类型,否则 CASE 将因数据转换而失败;这在示例中显示。
- 模(%)11的结果永远不会是11;除以 11 的余数将在 0 到 10 之间,因此第二个 CASE/WHEN 将 永远不会 被击中。