我昨天回答了一个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
函数。
有谁能解释这里发生了什么?
答案 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标准定义的语法,不再是窗口函数中ANY
或GROUP BY
子句的函数。
OVER
之前需要=
的原因是ANY
也适用于其他运营商。它意味着"在左边对着右边数组中的每个元素测试操作符,如果对于至少一个元素测试为真,则返回true。"
您可以使用ANY
或其他任何内容。它是一个通用运算符,不限于> ANY (ARRAY[...])
。对=
特别有用(尽管性能稍差)。
还有LIKE ANY
,它做了很多相同的事情但只有在所有结果都为真时才返回true。