为什么需要" ="在使用数组作为参数的任何函数之前,在postgres过程中?

时间:2017-01-19 10:42:24

标签: arrays postgresql stored-procedures any

我昨天回答了一个postgres问题,并且还遇到了一个postgres主题(here),他们描述了以下错误:

ERROR:  operator does not exist: text = text[]
HINT:  No operator matches the given name and argument type(s). You
might need to add explicit type casts.

如果在不使用ANY的情况下将ARRAY字符串类型提供给= ANY,则似乎会出现错误。这看起来很奇怪,因为基于语言,逻辑和sql约定,通常你有(例如IN):

variable FUNCTION(set)

而不是。

variable = FUNCTION(set) 除非当然运算符是一个总结/计数操作,返回一个结果:)

更有意义的是variable ANY(Set/Array)代替variable=ANY(Set/Array)。类似的例子是IN函数。

有谁能解释这里发生了什么?

1 个答案:

答案 0 :(得分:4)

* A * ticket: * one * note * my note * B * ticket: * two * three * note: * nothing to report * C * ticket: * four * note: * none 基本上等同于IN (...)

至关重要的是, = ANY (ARRAY[...])不是函数。它是由SQL标准定义的语法,不再是窗口函数中ANYGROUP BY子句的函数。

OVER之前需要=的原因是ANY也适用于其他运营商。它意味着"在左边对着右边数组中的每个元素测试操作符,如果对于至少一个元素测试为真,则返回true。"

您可以使用ANY或其他任何内容。它是一个通用运算符,不限于> ANY (ARRAY[...])。对=特别有用(尽管性能稍差)。

还有LIKE ANY,它做了很多相同的事情但只有在所有结果都为真时才返回true。