我有以下查询:
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
答案 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);
}
祝你好运。