使用Case来求和NULL实例会导致缺少表达式错误

时间:2016-09-27 22:36:44

标签: sql oracle

我正在尝试使用以下查询生成没有列出价格或里程的车辆列表。当我尝试运行查询时,我收到错误“ORA-00936:缺少表达式”,但似乎无法找出原因。从这里的其他帖子,我可以看到使用IS NULL应该是WHEN部分的适当术语,但我没有看到查询本身有任何问题。任何帮助将不胜感激!

Select
    SUM(CASE vehicles.mileage WHEN IS NULL THEN 1 ELSE 0 END) NO_MILEAGE,
    SUM(CASE vehicles.price WHEN IS NULL THEN 1 ELSE 0 END) NO_PRICE
From
    [data]

2 个答案:

答案 0 :(得分:4)

简单的语法错误:

Select
    SUM(CASE WHEN vehicles.mileage IS NULL THEN 1 ELSE 0 END) NO_MILEAGE,
    SUM(CASE WHEN vehicles.price   IS NULL THEN 1 ELSE 0 END) NO_PRICE
From
    [data];

这假设您的vehicles子句中有一个名为FROM的表,或者[data]中名为vehicles的具有对象或嵌套表类型的列。此外,资格vehicles.没有意义。

使用"搜索" CASE在两个备选方案之间作出决定。

Details about "simple" and "searched" CASE in the Oracle online reference.

您还可以针对特定情况使用 COUNT The online reference again:

  

如果您指定expr,则COUNT会返回expr不为空的行数。

     

如果指定星号(*),则此函数返回所有行,   包括重复和空值。 COUNT永远不会返回null。

所以你需要区别:

Select 
    COUNT(*) - COUNT(vehicles.mileage) AS NO_MILEAGE,
    COUNT(*) - COUNT(vehicles.price)   AS NO_PRICE
From
    [data];

答案 1 :(得分:1)

您也可以使用Oracle的NVL2函数:

Select
    SUM(NVL2(vehicles.mileage, 0, 1)) NO_MILEAGE,
    SUM(NVL2(vehicles.price, 0, 1)) NO_PRICE
From
    [data]