ORA-00905:CASE的THEN子句缺少关键字?

时间:2016-08-09 15:08:09

标签: mysql oracle postgresql case

我有以下查询:

SELECT name,tid FROM table_name WHERE status=1 AND
CASE
WHEN EXISTS (SELECT 1 FROM table_name WHERE name='name1' AND tid='tid1' AND status=1)
THEN name='name1' AND tid='tid1'
ELSE name='name2' AND tid='tid2'
END;

以上查询适用于postgres和mysql但在oracle中我收到此错误:

THEN name='name1' AND AND tid='tid1'
         *
ERROR at line 4:
ORA-00905: missing keyword

有人可以告诉我这里有什么问题以及如何纠正查询以便所有三个 - postgres,mysql和oracle

2 个答案:

答案 0 :(得分:1)

在Oracle中,CASE语句不能返回布尔表达式。这是一种在没有CASE的情况下做你想做的事情的方法:

SELECT name, tid
FROM table_name
WHERE status = 1 AND
      (EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) AND
       name = 'name1' AND tid = 'tid1'
      ) OR 
      (NOT EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) AND
       name = 'name2' AND tid = 'tid2'
      );

或者,您可以将其表达为:

SELECT name, tid
FROM table_name
WHERE status = 1 AND
      (CASE WHEN EXISTS (SELECT 1 FROM table_name WHERE name = 'name1' AND tid = 'tid1' AND status = 1) 
            THEN (CASE WHEN name = 'name1' AND tid = 'tid1' THEN 'true' END)
            ELSE (CASE WHEN name = 'name2' AND tid = 'tid2' THEN 'true' END)
      ) = 'true'

用布尔值理解CASE可能很棘手。嵌套的CASE语句更是如此。但是,此版本确实具有仅运行子查询一次的优势。

答案 1 :(得分:0)

在Oracle中,您无法使用CASE表达式来添加' WHERE子句的子句。如果我了解您正在尝试正确执行的操作,那么我认为您的查询可以简化为

byte r, g, b;
    scr->GetRGB(mid.x, mid.y, (byte)& r, (byte)& g, (byte)& b);
    while (r != (byte)0 && g != (byte)0 && b != (byte)0)
    {
        scr->SetRGB(mid.x, mid.y, (byte)255, (byte)0, (byte)0);
        mid.x++;
        FloodFill(scr, mid);
        mid.x--;
        mid.x--;
        FloodFill(scr, mid);
        mid.y++;
        FloodFill(scr, mid);
        mid.y--;
        mid.y--;
        FloodFill(scr, mid);
    }

祝你好运。