postgresql SQL“IN”运算符,左侧为文字值,右侧为列

w6mmgewl  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(201)

我以一种非常规的方式使用IN操作符,在左侧使用文字值,在右侧使用列
因此,而不是:

(table1.id = 123 OR table2.id = 123 OR table3.id = 123)

我用途:

123 IN (table1.id, table2.id, table3.id)

但是,我觉得它有点不好,因为它不是一个常见的用法,所以数据库实现可能没有针对它进行调优。通常,左侧是列名,右侧是动态文字值的可变大小列表。
我正在使用PostgreSQL,没有发现任何问题。
有没有人可以分享他的经验,如果这种用法会导致问题?

5w9g7ksd

5w9g7ksd1#

您永远不能排除bug的可能性,但在这种情况下,我也不会预先担心它们。我很惊讶地看到,当同一个表中有多个列时,使用BitmapOr的最明显的优化仍然应用于IN列表。(当它们不在同一个表中时,我不认为任何一种编写方式都能得到很好的优化。
我可能会避免这种编写方式,这是为了那些需要阅读我的代码的人,而不是为了计算机。但如果涉及的常数比“123”长得多,也许避免重复就值得非常规编码。

daupos2t

daupos2t2#

  • 根据我的经验,使用IN操作符,左边是文字值,右边是列,这不是一种常见的用法,但它应该在大多数数据库系统中正常工作,包括PostgreSQL。数据库优化器应该能够有效地处理这种类型的查询。
  • 在PostgreSQL中,IN操作符被设计为在右侧接受一个值列表或一个子查询。在您的例子中,您在右侧提供了列名,这是非常规的,但却是有效的。
  • 只要您的查询返回预期的结果并且性能良好,那么以这种方式使用IN运算符应该不会有直接的问题或性能问题。
  • 但是,值得注意的是,对于不熟悉这种非常规模式的其他开发人员来说,这种用法可能会降低SQL查询的可读性和直观性。通常建议遵循标准SQL实践,以获得更好的代码可维护性和协作。
  • 如果您担心这种用法的性能或潜在问题,您可以考虑使用大型数据集测试查询,或者咨询数据库Maven,以评估特定于您的应用程序和数据库环境的任何潜在缺点。

相关问题