使用带有字符串数组的IN谓词时,PostgreSQL缺少运算符

时间:2014-08-20 08:22:59

标签: c# postgresql dapper npgsql

鉴于此表结构:

CREATE TABLE tags
(
  id SERIAL NOT NULL PRIMARY KEY,
  tagname TEXT NOT NULL UNIQUE,
  authorid int NOT NULL,
  created timestamp NOT NULL,
  lastmodified timestamp NOT NULL,

  constraint fk_authorid_tags foreign key(authorid) references users(id)
);

为什么以下查询失败并显示错误:

ERROR:  operator does not exist: text = text[]
LINE 2: select * from tags where tagname in ('{"c#","c"}'::text[])

查询:

select * from tags where tagname in ('{"c#","c"}'::text[])

1 个答案:

答案 0 :(得分:5)

IN必须包含文字列表,例如

tagname IN ('c#', 'c')

如果您需要数组,则必须使用= ANY

tagname = ANY (ARRAY['c#', 'c'])

由于tagname IN (somearray)被解释为查询“tagname等于1元素列表(somearray)的任何元素”,因此出现错误。这意味着测试tagnamesomearray的平等,这是唯一的元素。由于没有=运算符来比较texttext[],因此失败。

相比之下,= ANY说“对于右侧数组的任何元素,左手操作数是否等于元素?”。所以它有效。