带有 dapper 和 postgresql 的“WHERE x IN y”子句抛出 42601:在 \"$1\" 处或附近出现语法错误
Posted
技术标签:
【中文标题】带有 dapper 和 postgresql 的“WHERE x IN y”子句抛出 42601:在 \\"$1\\" 处或附近出现语法错误【英文标题】:"WHERE x IN y" clause with dapper and postgresql throwing 42601: syntax error at or near \"$1\"带有 dapper 和 postgresql 的“WHERE x IN y”子句抛出 42601:在 \"$1\" 处或附近出现语法错误 【发布时间】:2016-01-16 14:14:56 【问题描述】:我有一个字符串数组,我想要一个包含 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...
我像这样打了一个 Dapper 电话
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\"" 处或附近的语法错误
【问题讨论】:
猜测您在此处查询的数据格式不正确。 对不起,你什么意思? 【参考方案1】:在 PostgreSQL 中,你不能使用 IN 来检查一个值是否在一个数组中,你必须使用以下 PostgreSQL 特定的语法:where t.name = ANY (@tagsParam)
。请参阅PostgreSQL docs 中的第 8.15.5 节。
【讨论】:
嗯,当我做...and t.name = ANY @tagsParam
时仍然没有运气。我认为 postgresql 确实支持“IN”: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')...
这样的查询时,它确实有效..
PostgreSQL 支持 IN,但不支持数组类型 - (1, 2) 不是数组类型。使用 ANY 语法,您可以尝试用括号括住 @tagParam 吗?
这令人困惑,因为您通常希望 Dapper 将 where foo in (@array)
重写为 where foo in (@a1, @a2, ...)
,但出于某种原因它不会为 PostgreSQL 这样做。
我现在对 Postgres 完全失去了信心:D以上是关于带有 dapper 和 postgresql 的“WHERE x IN y”子句抛出 42601:在 \"$1\" 处或附近出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章
使用 Dapper (C#) 调用 PostgreSQL 存储过程