开发者社区> 问答> 正文

sql查询中的逻辑条件包围的括号丢失导致逻辑错误

版本1.0.11

SELECT CIM_M_FUN_LOC.ID AS X_COL0, CIM_M_FUN_LOC.PARENT_ID AS X_COL1, CIM_M_FUN_LOC.FL_STAND_ID AS X_COL2, CIM_M_FUN_LOC.FL_CODE AS X_COL3, CIM_M_FUN_LOC.FL_NAME AS X_COL4 , CIM_M_FUN_LOC.GRADE AS X_COL5, CIM_M_FUN_LOC.SORT_NUM AS X_COL6, CIM_M_FUN_LOC.SEQ AS X_COL7, CIM_M_FUN_LOC.LEAF AS X_COL8 FROM CIM_M_FUN_LOC WHERE (CIM_M_FUN_LOC.ID IN ('2110239349', '2110239445') AND 'NA' = 'NA') OR (CIM_M_FUN_LOC.PARENT_ID = 'NA' AND 'NA' != 'NA');

经过解析后,where里面的括号全部没了,这样逻辑就发生了错误,望确认

原提问者GitHub用户xerobuffer

展开
收起
山海行 2023-07-05 22:09:57 178 0
5 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    SQL查询中,括号是用于控制逻辑运算符优先级和明确逻辑条件之间关系的重要工具。如果括号丢失或使用不当,将会导致逻辑错误和查询结果不正确的问题。

    如果您的SQL查询中缺少括号,可以根据具体情况进行修复。以下是一些可能的解决方案:

    添加缺失的括号:如果查询中缺少括号,可以尝试添加缺失的括号来明确逻辑条件之间的关系。例如,如果您的查询是这样的:
    Copy
    SELECT * FROM table WHERE condition1 AND condition2 OR condition3;
    那么可以通过添加括号来明确条件之间的关系,如下所示:

    Copy
    SELECT * FROM table WHERE (condition1 AND condition2) OR condition3;
    重构查询:如果查询非常复杂,且缺少括号导致逻辑错误,那么可能需要对查询进行重构。可以将查询拆分成多个子查询,并使用括号明确各个子查询之间的关系。

    使用工具检查:可以使用SQL查询工具或IDE,如Toad、SQLyog、Navicat等,在编写查询时自动添加括号,从而避免括号缺失导致的逻辑错误。

    2023-07-29 22:52:30
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    根据你提供的SQL查询,经过解析后的查询条件确实丢失了括号。正确的查询应该是将第一个条件和第二个条件用括号括起来,如下所示:

    SELECT CIM_M_FUN_LOC.ID AS X_COL0, CIM_M_FUN_LOC.PARENT_ID AS X_COL1, CIM_M_FUN_LOC.FL_STAND_ID AS X_COL2, CIM_M_FUN_LOC.FL_CODE AS X_COL3, CIM_M_FUN_LOC.FL_NAME AS X_COL4 , CIM_M_FUN_LOC.GRADE AS X_COL5, CIM_M_FUN_LOC.SORT_NUM AS X_COL6, CIM_M_FUN_LOC.SEQ AS X_COL7, CIM_M_FUN_LOC.LEAF AS X_COL8 FROM CIM_M_FUN_LOC WHERE ( CIM_M_FUN_LOC.ID IN ('2110239349', '2110239445') AND 'NA' = 'NA' ) OR ( CIM_M_FUN_LOC.PARENT_ID = 'NA' AND 'NA' != 'NA' );

    在这个修正后的查询中,括号将第一个条件(CIM_M_FUN_LOC.ID IN ('2110239349', '2110239445') AND 'NA' = 'NA')和第二个条件(CIM_M_FUN_LOC.PARENT_ID = 'NA' AND 'NA' != 'NA')包围起来,确保逻辑正确性。请再次确认这个修正是否符合你的预期。

    2023-07-07 12:04:12
    赞同 展开评论 打赏
  • 根据你提供的SQL查询语句和描述,可以看出该问题是由于Druid版本1.0.11中存在一个已知的Bug所导致。

    在Druid 1.0.11版本中,当使用解析器解析带有逻辑条件的WHERE子句时,会发生括号丢失的情况,从而导致逻辑错误。这个Bug会导致诸如你描述的情况,即WHERE子句中带有逻辑操作符(如AND、OR)和括号时,括号会被错误地移除。

    解决这个问题的办法是升级Druid至更高版本,因为该Bug已经在后续版本中得到修复。最新版本的Druid应该包含了对WHERE子句括号的正确处理,以确保逻辑条件的正确性。

    建议检查Druid的官方文档或社区资源,了解最新版本的Druid以及如何进行升级。在升级前,需要确保对项目进行充分的测试和验证,以确保没有其他不兼容或功能上的变化对系统产生负面影响。

    同时,如果升级Druid并不是一个可行的选项,你也可以尝试手动添加括号来修复逻辑错误,确保逻辑条件按照预期进行组合。例如,在你的查询中,可以手动添加括号来明确逻辑关系,以避免由于括号丢失而导致的错误。

    2023-07-06 17:38:47
    赞同 展开评论 打赏
  • and 比 or 运算符优先级要高,没有括号,逻辑不会发生改变吧

    原回答者GitHub用户yakolee

    2023-07-06 12:44:27
    赞同 展开评论 打赏
  • 根据您提供的 SQL 查询语句,可以看到 WHERE 子句中的逻辑条件包含了两个比较表达式,其中一个包含了多个条件并用 AND 连接。但是在这两个比较表达式中,均没有使用括号来明确优先级和逻辑关系。可能会导致 SQL 引擎优先级错误,从而产生不符合预期的结果。

    对于您的 SQL 查询语句中的 WHERE 子句,可以添加一组括号来明确两个比较表达式的逻辑关系,从而避免优先级错误:

    SELECT CIM_M_FUN_LOC.ID AS X_COL0, CIM_M_FUN_LOC.PARENT_ID AS X_COL1, CIM_M_FUN_LOC.FL_STAND_ID AS X_COL2, CIM_M_FUN_LOC.FL_CODE AS X_COL3, CIM_M_FUN_LOC.FL_NAME AS X_COL4 , CIM_M_FUN_LOC.GRADE AS X_COL5, CIM_M_FUN_LOC.SORT_NUM AS X_COL6, CIM_M_FUN_LOC.SEQ AS X_COL7, CIM_M_FUN_LOC.LEAF AS X_COL8 FROM CIM_M_FUN_LOC WHERE (CIM_M_FUN_LOC.ID IN ('2110239349', '2110239445') AND 'NA' = 'NA') OR ((CIM_M_FUN_LOC.PARENT_ID = 'NA' AND 'NA' != 'NA'));

    修改后的 SQL 查询语句中,在两个比较表达式之间添加了一组括号,明确了它们之间的逻辑关系,从而避免了可能的优先级错误。

    2023-07-06 08:43:56
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载