我被告知在我正在阅读的一本书中使用这样的案例表达式:
select name || case type_id
when 7 then ' is a drink'
when 8 then ' is a fruit'
when 9 then ' is junkfood'
when 13 then ' is seafood'
else null
end description
from foods
where description is not null
order by name
limit 10;
然而,这给了我一个错误:
执行查询时出错:没有这样的列:description
我要做的是避免空值。那么哪里出错了?
答案 0 :(得分:2)
我愿意打赌“foods”表没有“description”列,并且你希望WHERE子句从你的case语句中获取列别名。
不应该这样做。在标准SQL中,WHERE子句在SELECT子句之前计算。这意味着您在SELECT子句中提供的任何别名都不可用于WHERE子句。但SQLite允许这样做。 (见下文。我在文档中没有找到这个“功能”。)
你可能正在寻找这个。
where type_id is not null
或者可能正在寻找这个。
where type_id not in (7, 8, 9, 13)
<小时/> 从技术上讲,SQL引擎只需要行为,就像它在SELECT子句之前评估WHERE子句一样,如果它想要符合SQL标准。对像我们这样的程序员的影响是一样的。
sqlite> create table foods (name varchar(15), type_id integer);
sqlite> insert into foods values ('Tequila', 7), ('Apple', 8),
...> ('Twinkie', 9), ('Tuna', 13), ('Olive oil', null);
sqlite> select name || case type_id
...> when 7 then ' is a drink'
...> when 8 then ' is a fruit'
...> when 9 then ' is junkfood'
...> when 13 then ' is seafood'
...> else null
...> end description
...> from foods
...> where description is not null
...> order by name
...> limit 10;
Apple is a fruit
Tequila is a drink
Tuna is seafood
Twinkie is junkfood
答案 1 :(得分:0)
您编写的查询将无法在任何SQL方言中使用(对不起,但该示例不起作用)。您可以使用子查询执行所需的操作:
select description
from (select name || (case type_id
when 7 then ' is a drink'
when 8 then ' is a fruit'
when 9 then ' is junkfood'
when 13 then ' is seafood'
else ''
end) as description,
name
from foods
) f
where description is not null
order by name
limit 10;
注意我将else
子句更改为空子字符串而不是NULL
。