嗨我有一个非常慢的SQL。
select case when (value=1)
then (select <Some Math Logic> from table where table.id=table_2.id)
else 'false' end
from table_2 where <where clause>
我想知道的是case子句如何工作.. ??
部分select <Some Math Logic> from table
正在处理庞大的表集。
if(condition_1==true)
{return output;}
else
{return false;}
如果if语句为false,则其中的部分永远不会被处理,那么我想知道的是oracle SQL中是否也是相同的。
它是否适用于以下逻辑.. ??
还是采用以下逻辑:
请帮助
编辑:伙计们我不想调整上面显示的查询...这只是一个虚拟的。
我需要知道的是案例条款如何逐步运作。
请分享是否有人为此提供了一些意见
答案 0 :(得分:2)
这会解决您的问题吗?
SELECT
COALESCE(<Some Math Logic>, 'false')
FROM table_2 T2
LEFT JOIN table T
ON T.Id = T2.Id
and T2.value = 1
WHERE <where clause>
答案 1 :(得分:0)
好问题。您需要查看执行计划以确定。数据库引擎可以自由使用它认为合适的任何算法,只要它能够获得您要求的结果。
它甚至可以外连接table
以获得预期值= 1的结果。或者它可以运行select from table并将结果存储到临时表中,它可以在运行主查询时扫描
然而,最有可能的是,它为值= 1的每一行运行子查询。很难说没有看到计划。
这还取决于细节。你在进行聚合吗?如果是这样,真正的连接可能是不可能的,它可能必须重新计算每一行的答案。如果它正在查看表行上的值,那么它可能能够优化它。
如果您取出case语句,整个查询的执行速度会快得多吗?想确保分析正确的子查询。
答案 2 :(得分:0)
似乎逻辑与java中的逻辑完全一样。
我使用以下逻辑来测试您的场景:
我创建了一个虚函数,如下所示,只是在dbms_output上写一些东西,只返回10。
CREATE OR REPLACE
FUNCTION DISP_MSG
RETURN VARCHAR2
AS
ret_val VARCHAR2(20):='10';
BEGIN
dbms_output.enable;
dbms_output.put_line('executed');
RETURN ret_val;
END DISP_MSG;
然后我创建了一个匿名块来测试它:
DECLARE
var VARCHAR2(100);
BEGIN
SELECT CASE WHEN (1!=1) THEN DISP_MSG ELSE '1' END INTO var FROM dual;
dbms_output.put_line('j = '||var);
END;
输出:
j = 1
但是当我尝试以下内容时:
DECLARE
var VARCHAR2(100);
BEGIN
SELECT CASE WHEN (1=1) THEN DISP_MSG ELSE '1' END INTO var FROM dual;
dbms_output.put_line('j = '||var);
END;
输出:
已执行
j = 10
所以很清楚什么是执行逻辑