SQL执行报错:WHERE子句附近指定了非布尔类型表达式 求排查
SQL运行报错排查:WHERE附近出现非布尔类型表达式错误
原出错SQL代码
SELECT emissaogrd.dataEmissao, grd_dados.grd, documento.numero, emissaogrd.revDoc, recebimento.nome, grd_dados.usuariogrd FROM documento JOIN grd_dados JOIN emissaogrd JOIN recebimento WHERE emissaogrd.idgrd = grd_dados.grd AND emissaogrd.idDoc = documento.id AND emissaogrd.idgrd = recebimento.grdId ON recebimento.entregue='0' ORDER BY grd_dados.grd DESC, documento.numero;
报错信息
An expression of non-boolean type specified in a context where a condition is expected, near WHERE
中文释义:在WHERE关键字附近、期望条件的上下文中指定了非布尔类型的表达式
错误原因
- 违反SQL JOIN语法规则:标准SQL中每一个
JOIN关键字后必须紧跟对应的ON子句,写明两表关联的匹配条件。这段代码把4张表的JOIN全部堆在一起,没有逐表写关联条件,还把本该属于WHERE的筛选条件错放在了ON的位置,把表关联条件全部塞到WHERE子句中,导致SQL解析器读到WHERE位置时无法识别合法的布尔判断结构,直接抛出语法错误。
修正后可正常运行的代码
SELECT emissaogrd.dataEmissao, grd_dados.grd, documento.numero, emissaogrd.revDoc, recebimento.nome, grd_dados.usuariogrd FROM documento JOIN emissaogrd ON emissaogrd.idDoc = documento.id JOIN grd_dados ON emissaogrd.idgrd = grd_dados.grd JOIN recebimento ON emissaogrd.idgrd = recebimento.grdId WHERE recebimento.entregue='0' ORDER BY grd_dados.grd DESC, documento.numero;
修正点说明
- 为每一个JOIN匹配了对应的ON关联条件,关联逻辑和原写法完全一致,不会改变业务查询结果
- 将放错位置的筛选条件
recebimento.entregue='0'移到WHERE子句中作为全局过滤条件 - 调整了表关联的书写顺序,保证关联时引用的字段已经出现在已关联的表中,避免部分数据库报字段不存在的错误
内容的提问来源于stack exchange,提问作者Steken
相关产品推荐
相关产品推荐

