2017-04-05 103 views
0

在这个SQL我只是想检查在”ON“子句b.block ='False'.Because有时”profileview“表值是空的 我只是想,如果user_fullinfo值profileview与此条件b.block =“假”应该是显示相匹配时,如果值不存在于轮廓图也然后它应该显示,SQL错误说“不正确的语法”=“

SELECT a.* FROM user_fullinfo a left join profileview b on 
CASE 
WHEN a.id=b.rid and b.rid='105' THEN 
b.block='False' 
END 
where gender != 'Male' and (DATEDIFF(YY,dob,GETDATE()) Between '10' and '100') and (a.heightid between 58 and 65) and(a.complexionid = '3' or a.complexionid = '4' or a.complexionid = '5') and a.bodytypeid = '4' and a.marital_statusid = '3' 

它说SQL错误(102):不正确语法靠近“=”.. 请给解决办法..

+0

为什么'mysql'标记在这里? –

+0

声明是mysql-syntax,无法识别我的sql服务器 – Psi

+0

连接条件在哪里? –

回答

0

布尔表达式不适合作为值,例如的值。我的建议是完全删除case,只使用布尔逻辑。事情是这样的:

select a.* 
from user_fullinfo a left join 
    profileview b 
    on (a.id = b.rid and b.rid = '105' and b.block = 'False') or 
     (not (a.id = b.rid and b.rid = '105' and b.block = 'False') and 
      gender <> 'Male' and (datediff(year, dob, getdate()) Between 10 and 100) and 
      (a.heightid between 58 and 65) and 
      (a.complexionid in (3, 4, 5)) and 
      a.bodytypeid = 4 and a.marital_statusid = 3 
     ); 

注:

  • 在SQL SQL不平等的标准是<>,虽然!=也被广泛接受。
  • 不要在数字常量周围使用单引号。 between '10' and '100'between 10 and 100不一样。
  • 我怀疑,这个版本还是您case版本确实你想要什么。对于第二种情况,两个表之间没有相关性。

这应该解决你的语法的问题。逻辑问题是一个不同的问题。我建议你询问另一个问题,包括样本数据,期望值,结果和对逻辑的解释。

+0

Ok.I将使用此method..thanks .. –

+0

如果这是正确的,请不要忘记,以纪念这是公认的答案。 – Charlesliam

+0

其不正确我将使用此方法.. –

0

正弦你的case语句只有1个条件,你可以使用直接连接,而不是像下面

SELECT 
    a.* 
    FROM user_fullinfo a 
     LEFT JOIN profileview b 
      ON a.id = b.rid 
       AND b.rid ='105' 
       AND b.block ='False' 
     WHERE gender <> 'Male' 
      AND (DATEDIFF(YY,dob,GETDATE()) BETWEEN '10' AND '100') 
      AND (a.heightid between 58 and 65) 
      AND 
      (
       a.complexionid = '3' 
       OR 
       a.complexionid = '4' 
       OR 
       a.complexionid = '5' 
      ) 
      AND a.bodytypeid = '4' 
      AND a.marital_statusid = '3' 

如果您有任何其他case语句,你需要添加你可以改变像声明这

ON 
(
    (
    a.id = b.rid 
    AND b.rid ='105' 
    AND b.block ='False' 
) 
    OR 
    (
    a.id = b.rid 
    AND b.rid ='105' 
    AND b.block ='True' 
) 
)