开发者社区> 问答> 正文

db2 select item 中存在IDENTITY关键字时,解析出错

由于历史项目原因,有个表中的字段名称为IDENTITY,同样也是db2关键字,这样我们在分析语句: SELECT ID,IDENTITY,BUSICODE FROM BUSINESS_ENTERPRISE_BUSIINFO WHERE SYSCODE= '603' ORDER BY INTIME desc FETCH first 1 rows only

时出错,分析到IDENTITY时认为是关键字,便无法解析了,但是该语句在db2中的执行时没有问题的,db2会分析上下文环境来判断该字段是不是关键字。 目前我们临时添加了引号来避免该问题,如下: SELECT ID, “IDENTITY”, BUSICODE FROM BUSINESS_ENTERPRISE_BUSIINFO 也在新开发项目中避免使用关键字作为表字段。

在select item的分析中,仅仅通过匹配关键字的方式就认为是关键字好像不太合理。

原提问者GitHub用户leezongjie

展开
收起
山海行 2023-07-05 21:40:36 51 0
3 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    DB2数据库中,IDENTITY是一个关键字,用于指定一个自增长列。如果在SELECT语句中包含了一个名称为IDENTITY的列,就会导致解析错误。

    为了解决这个问题,可以使用双引号将包含IDENTITY关键字的列名括起来,例如:

    Copy
    SELECT "IDENTITY", column1, column2 FROM table1;
    在这个SQL语句中,使用双引号将包含IDENTITY关键字的列名括起来,从而避免了解析错误。

    另外,为了避免这种问题,建议在设计数据库时避免使用保留字或关键字作为列名,这样可以避免在后续的SQL语句中出现解析错误的情况。

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

    你提到的问题确实存在,由于部分数据库关键字也可以作为表字段名,因此在解析SQL时会导致解析器错误地将包含关键字的字段名识别为关键字。

    在DB2中,可以通过在字段名周围使用引号来避免将其识别为关键字。像你提到的那样,将字段名IDENTITY用引号括起来可以正确识别并解析。

    关于解析器仅仅通过匹配关键字来判断是否为关键字的问题,具体的解析器设计可能因供应商而异。这种设计可能是为了在解析过程中保持简单和高效。然而,正如你所指出的,这种设计并不完善,因为可以通过更多的上下文信息来判断字段名是否是关键字。

    对于使用关键字作为表字段名的情况,最佳做法是将字段名用引号括起来,以避免解析器误识别。同时,尽量避免在新开发项目中使用关键字作为字段名,以避免产生类似的问题。

    如果你认为解析器的行为不够合理,可以向DB2的开发团队反馈该问题,并提出改进建议。这样可以帮助他们改善解析器的准确性和健壮性。

    2023-07-11 17:13:35
    赞同 展开评论 打赏
  • 问题已修复,请用新版本 https://github.com/alibaba/druid/releases/tag/1.1.14

    原回答者GitHub用户wenshao

    2023-07-06 12:17:22
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
神龙云服务器产品及技术深度解析 立即下载
弹性创造价值:基于ECS的最佳性价比实践解析 立即下载
又快又稳:阿里云下一代虚拟交换机解析 立即下载

相关镜像