2016-05-16 67 views
0

我的代码工作并不像我想:如果连接返回false,则立即使用其他连接。它可能吗?

SELECT 
      r.id, 
      IF(exp.id != 0, 1, 
      IF(exp2.id != 0, 1, 
       IF(exp3.id != 0, 1, 0) 
      ) 
     ) AS white_list 

FROM rates AS r 

LEFT JOIN 
exclusion_policies AS exp ON (
    1 = 1 
    AND exp.client_id = r.client_id 
    AND exp.mcc   = r.mcc 
    AND exp.mnc   = r.mnc 
    AND exp.active  = 1 
) 
LEFT JOIN 
exclusion_policies AS exp2 ON (
    1 = 1 
    AND exp2.client_id = r.client_id 
    AND exp2.mcc   = r.mcc 
    AND exp2.active  = 1 
) 
LEFT JOIN 
exclusion_policies AS exp3 ON (
    1 = 1 
    AND exp3.client_id = r.client_id 
    AND exp3.active  = 1 
) 

我想,如果先加入exp为true,则停止verfy EXP2和EXP3: somethig像:

CASE WHEN 
    LEFT JOIN 
    exclusion_policies AS exp ON (
    1 = 1 
    AND exp.client_id = r.client_id 
    AND exp.mcc   = r.mcc 
    AND exp.mnc   = r.mnc 
    AND exp.active  = 1 
) 
THEN true // exp is not null, ONLY 
ELSE 

    CASE WHEN 
    LEFT JOIN 
     exclusion_policies AS exp2 ON (
     1 = 1 
     AND exp2.client_id = r.client_id 
     AND exp2.mcc   = r.mcc 
     AND exp2.active  = 1 
    ) 
    THEN true // exp2 is not null, ONLY 
    ELSE 

     CASE WHEN 
     LEFT JOIN 
     exclusion_policies AS exp3 ON (
     1 = 1 
     AND exp3.client_id = r.client_id 
     AND exp3.active  = 1 
    ) 
     THEN true // exp3 is not null, ONLY 
     ELSE false // exp, exp2, exp3 are null 
     END 

    END 
END 

我需要得到真正的(1),IF

IF(exp.id != 0, 1, 
    IF(exp2.id != 0, 1, 
    IF(exp3.id != 0, 1, 0) 
) 
) AS white_list 

顺便说一下,也许REVERS更加优化LEFT JOIN EXP3,2,1只的第三个,任何方式

+0

您可以发表表格定义和样本数据吗? –

回答

1

您可以通过在ON子句中放入正确的逻辑来创建条件连接。如果ON条件为真,就会进行加入。像下面的代码。我还没有测试过,但你可以尝试一下,然后再次发布。

SELECT 
    r.id, 
    IF(exp.id != 0, 1, 
    IF(exp2.id != 0, 1, 
     IF(exp3.id != 0, 1, 0) 
    ) 
    ) AS white_list 

FROM rates AS r 
LEFT JOIN exclusion_policies AS exp ON 
     exp.client_id = r.client_id AND 
     exp.mcc   = r.mcc AND 
     exp.mnc   = r.mnc AND 
     exp.active  = 1 
LEFT JOIN exclusion_policies AS exp2 ON 
     NOT (exp2.client_id = r.client_id AND 
      exp2.mcc   = r.mcc AND 
      exp2.mnc   = r.mnc AND 
      exp2.active  = 1) AND 
     exp2.client_id = r.client_id AND 
     exp2.mcc   = r.mcc AND 
     exp2.active  = 1 
LEFT JOIN exclusion_policies AS exp3 ON 
     NOT (exp3.client_id = r.client_id AND 
      exp3.mcc   = r.mcc AND 
      exp3.mnc   = r.mnc AND 
      exp3.active  = 1) AND 
     NOT (exp3.client_id = r.client_id AND 
      exp3.mcc   = r.mcc AND 
      exp3.active  = 1) AND 
     exp3.client_id = r.client_id AND 
     exp3.active  = 1 
+0

intresting,但在任何情况下,我越来越真实white_list – axon

0

我sloved它,

感谢某人

IF(exp3.id != 0, 1,IF(exp2.id != 0, 1, IF(exp.id != 0, 1, 0))) 
 
FROM rates AS r 
 
    LEFT JOIN 
 
    exclusion_policies AS exp ON (
 
     exp.client_id  = r.client_id AND 
 
     exp.mcc    = r.mcc AND 
 
     exp.mnc    = r.mnc AND 
 
     exp.active   = 1 
 
    ) 
 
    LEFT JOIN 
 
    exclusion_policies AS exp2 ON (
 
     exp2.client_id  = r.client_id AND 
 
     exp2.mcc   = r.mcc AND 
 
     exp2.mnc   IS NULL AND 
 
     exp2.active  = 1 
 
    ) 
 
    LEFT JOIN 
 
    exclusion_policies AS exp3 ON (
 
     exp3.client_id  = r.client_id AND 
 
     exp3.mcc   IS NULL AND 
 
     exp3.mnc   IS NULL AND 
 
     exp3.active  = 1 
 
    )

+0

为什么进行三次测试时,最后你给'1'当客户端ID是相同的,不管是什么?这是低效的代码。 – trincot

0

你想获得一个1如有下列情况为真:

  • 存在exclusion_policies一个记录具有相同client_idmccmncactive = 1,或
  • 存在exclusion_policies一个记录具有相同client_idmccactive = 1,或
  • 存在exclusion_policies一个记录具有相同的client_idactive = 1

但你实际上是说你想1当存在exclusion_policies记录具有相同client_idactive = 1。似乎没有必要检查更具体的案例,因为它们是否属实并不影响基于上次检查的结果。

换句话说:这表达

IF(exp.id != 0, 1, 
    IF(exp2.id != 0, 1, 
     IF(exp3.id != 0, 1, 0) 
    ) 
) 

将只有当返回0,当且仅当存在exclusion_policies没有记录与同client_idactive = 1

所以你还不如执行该多更简单的SQL语句:

SELECT r.id, 
      COALESCE(MAX(exp.active), 0) AS white_list 
FROM  rates AS r 
LEFT JOIN exclusion_policies AS exp 
     ON exp.client_id = r.client_id 
      exp.active = 1 
GROUP BY r.id 
相关问题