PostgreSQL中IN操作符为何转为ANY+数组?如何阻止该转换?
问题解答
为什么IN操作符会被转换为ANY+数组形式?
PostgreSQL内部对IN (值列表)和= ANY(ARRAY[值列表])的处理逻辑完全等价,解析器在处理SQL时会将IN表达式规范化为ANY数组的形式,这是数据库统一执行逻辑的内部处理方式。
视图的定义在PostgreSQL中存储的是解析后的抽象语法树(AST),而非你输入的原始SQL文本。当通过pgAdmin查看视图SQL时,工具会从系统表中读取这个AST,再重新生成可执行的SQL语句,此时就会显示为数据库规范化后的ANY数组形式,而非你最初编写的IN语法。
如何保留IN操作符的写法?
无法直接阻止数据库的这种规范化转换,因为系统存储的不是原始SQL字符串。但可以通过以下方式保留原始写法的记录:
- 将创建视图的原始SQL脚本保存到本地代码仓库或文档中,作为源代码进行管理,系统存储的视图定义仅作为运行时的执行依据。
- 若需要在数据库层面保留逻辑的原始写法,可以考虑将判断逻辑封装到PL/pgSQL函数中,函数中用
$$包裹的源码文本通常会被原样存储,后续查看函数定义时能保留IN语法。
内容的提问来源于stack exchange,提问作者e1s
相关产品推荐
相关产品推荐

