带有 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 &gt; 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 存储过程

如何在不明确指定主键的情况下使用 Dapper Extensions 将对象插入 PostGreSql?

带有 MS Access 更新和插入问题的 Dapper

带有 Access 的 Dapper,更新语句部分不起作用

带有参数列表的 Dapper 查询

带有 GUID Id 的简洁 CRUD