回答

收藏

运算符不存在:使用ANY的查询中的integer = integer []

技术问答 技术问答 239 人阅读 | 0 人回复 | 2023-09-14

我经常使用integer =
( v0 }0 b: d7 A( N$ I4 ?5 MANY(integer[])语法,但是现在ANY运算符不起作用。这是我第一次使用它来比较标量和CTE返回的整数,但是我认为这不会引起问题。
  }9 _6 y/ l; [' s! i: O9 h我的查询:7 |& Z0 Z. Q- a
WITH bar AS (; T. q  S; g7 D, R4 j/ h
  SELECT array_agg(b) AS bs4 a2 S2 I- h  {( `2 w, j# ^
  FROM foo  I/ j' R0 o. }* ?. {# B1 {
  WHERE c 当我运行它时,它引发以下错误:
/ g* Y1 A: \+ H9 q$ N  s1 f( l3 c$ x# F
错误:运算符不存在:integer = integer []:WITH bar AS(SELECT array_agg(b)AS bs FROM foo
5 ]/ l0 M+ B# Q' W( ?/ ^2 nWHERE c
+ G5 I  k: R7 X

: W) V/ K( r+ T% a) u( Q有关此SQL Fiddle的详细信息。
+ l  b2 Z/ y- u/ W那我在做什么错?
; N- C" M+ {5 [                7 s2 }$ O7 G/ e2 i& N: [4 \+ d
解决方案:9 m8 [5 }3 i3 x& Z
                & k  P5 C5 B/ C* t6 _
8 d1 B* Z! I9 S" d
- t6 W4 B3 U+ l& z, i! R
                根据错误消息部分operator does not exist: integer =
2 w! ]3 `# P% ]6 b& {integer[],似乎需要对该bs列进行unnest编辑,以便使右侧回到,integer从而可以找到比较运算符:% Y" O, k3 W* X7 e4 s3 f
WITH bar AS (
- N3 ?; i; C7 I9 d7 `1 V% ]  SELECT array_agg(b) AS bs
/ Q1 b' L# z: b) j/ j  FROM foo
, H; g% \; j) _& c$ A  WHERE c 结果为输出:
2 }5 M! ?" Z! q6 m3 K, {A$ x; j' v0 E% p  B
2
. K4 ]2 x. I, P4 v/ n3
3 I  I- g: i' i: _给定ANY函数的文档:
7 S2 g% v+ B  Z- Q0 ^$ h; ]
$ O6 m! ~. u  R0 W6 _  q/ L右侧是带括号的子查询,该查询必须恰好返回一列。使用给定的运算符,将评估左侧表达式并将其与子查询结果的每一行进行比较,该运算符必须产生布尔结果。如果获得任何真实结果,则ANY的结果为“7 A- V' ?6 u, @# B! d
true”。如果找不到正确的结果,则结果为“ false”(包括子查询不返回任何行的情况)。
8 a  t; v% J9 L; u! T# A9 z1 B* q, g- [( K4 L) O# @- B
…该错误是有道理的,因为左侧表达式是integer-列b-而右侧表达式是integers或or的数组integer[],因此比较最终以integer=的形式结束integer[],
. j. n/ z6 V( I$ ?! {3 J& \8 Wt具有运算符,因此会导致错误。
' E$ I, B' k+ v$ `+ [6 O( \unnest将该integer[]值设为左手表达式integer和右手表达式,因此可以继续进行比较。+ R" u3 w! l: l! V" d9 K( }8 L
修改后的SQL Fiddle。; q- A3 D4 H. }2 Z' \8 F4 w5 C; U0 C
注意: 使用IN代替时会看到相同的行为= ANY。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则