CASE 语句 ALIAS 比较

Posted

技术标签:

【中文标题】CASE 语句 ALIAS 比较【英文标题】:CASE statement ALIAS comparison 【发布时间】:2016-01-19 22:17:02 【问题描述】:

这是我的查询:

SELECT DISTINCT v.codi, m.nom, v.matricula, v.data_compra, v.color,
 v.combustible, v.asseguranca, 
(CASE WHEN lloguer.dataf IS NOT NULL THEN 'Si' ELSE 'Llogat'  END) AS Disponible 
FROM vehicle v 
INNER JOIN model m on model_codi=m.codi 
INNER JOIN lloguer on codi_vehicle=v.codi 
WHERE Disponible='Si';

我要做的是只显示那些“lloguer.dataf”不为 NULL 的行,但它不允许我使用“Disponible”别名进行最后一行比较。

我能做什么?

这是在没有最后一行比较的情况下显示信息的方式(具有更多属性)。

【问题讨论】:

改用WHERE lloguer.dataf IS NOT NULL 你不能简单地写where lloguer.dataf IS NOT NULL吗? 【参考方案1】:

问题是别名还不存在。所以你必须重复完整的代码或者创建一个子查询。

SELECT *
FROM ( .... ) YourQuery
WHERE Disponible='Si';

您可以在此处阅读更多详细信息https://community.oracle.com/thread/1109532?tstart=0

【讨论】:

【参考方案2】:

从 SELECT 块中删除您的 CASE WHEN 并将您的 WHERE 子句替换为:

WHERE lloguer.dataf IS NOT NULL

【讨论】:

【参考方案3】:

我天生就是一个 TSQL 人,但你能做到吗?

Select distinct codi, nom,matricula, data_compra, colour, combustible, asseguranca from
(SELECT DISTINCT v.codi, m.nom, v.matricula, v.data_compra, v.color,
 v.combustible, v.asseguranca, 
(CASE WHEN lloguer.dataf IS NOT NULL THEN 'Si' ELSE 'Llogat'  END) AS Disponible 
FROM vehicle v 
INNER JOIN model m on model_codi=m.codi 
INNER JOIN lloguer on codi_vehicle=v.codi)
WHERE Disponible='Si';

正如@JuanCarlosOropeza 所说,在最初获取数据之前,别名不存在。这就是为什么您可以在不使用子查询的情况下在 order by 子句中使用别名,但在 where 子句中不能使用别名,因为尚未获取数据。

【讨论】:

稍微解释一下就好了。 @JuanCarlosOropeza - 我现在要添加一些。

以上是关于CASE 语句 ALIAS 比较的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Decode()函数和CASE语句的比较

PLSQL Case 语句比较两列

shell脚本——编程条件语句(条件测试if语句case分支语句)

使用大于和小于比较搜索的 CASE 语句

switch语句的用法

比较运算符在 Case 语句中的使用