dapper和postgresql中的"WHERE x IN y"子句抛出42601错误:在\"$1\"附近有语法错误。

21

我有一个字符串数组,想要使用包含IN子句的查询语句,例如:

"... WHERE t.name IN ('foo', 'bar', 'baz')..>"

这是我的查询的最后一部分,其中包含一个“where X in Y”子句:
...
left join genre_tag_band_join tj on hb.id = tj.band_id or ob.id = tj.band_id
left join genre_tags t on tj.genre_tag_id = t.id
inner join venues v on e.venue_id = v.id

where t.name IN @tagsParam...

I make a Dapper call like this

var shows = con.Query<Event, Band, Band, GenreTag, Venue, Event>(query, (e, hb, ob, gt, v) =>
{
    Event show;
    ...
    return e;
},
new { tagsParam = tagsArr}).AsQueryable();

其中tagsArr是一个字符串数组。

我遇到了异常:

{"42601: 在$1附近有语法错误"}


我猜测你在这里查询的数据格式不正确。 - Claies
抱歉,你是什么意思? - Sava B.
1个回答

31
在PostgreSQL中,不能使用IN来检查一个值是否在数组中,必须使用以下特定于PostgreSQL的语法:where t.name = ANY (@tagsParam)。请参见PostgreSQL文档第8.15.5节。

哦,当我执行...and t.name = ANY @tagsParam时仍然没有运气。我认为PostgreSQL支持“IN”:http://www.postgresqltutorial.com/postgresql-in/。当我在pgadmin中运行像`...inner join venues v on e.venue_id = v.id
where (e.date > current_date) and t.name in ('foo')...`这样的查询时,它确实有效。
- Sava B.
4
PostgreSQL支持IN语法,但不支持数组类型,例如(1,2)不是数组类型。使用ANY语法时,您可以尝试在@tagParam周围加上括号。 - Shay Rojansky
2
这很令人困惑,因为通常你期望Dapper将 where foo in (@array) 重写为 where foo in (@a1, @a2, ...) ,但出于某些原因它在PostgreSQL上没有这样做。 - wrschneider
我现在完全失去了对Postgres的信心 :D - Renato Medeiros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接