sqlite3中的case表达式

时间:2014-11-17 02:29:41

标签: sql sqlite case

我被告知在我正在阅读的一本书中使用这样的案例表达式:

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

我要做的是避免空值。那么哪里出错了?

2 个答案:

答案 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