PostgreSQL相当于SQL Server的TVP

时间:2016-02-08 15:19:28

标签: .net postgresql npgsql

SQL Server具有表值参数,允许您将值数组作为参数传递。

实现类似于PostgreSQL查询的适当方式是什么,所以我可以做类似的事情:

select * from product where id in ($1)

我正在使用Npgsql .NET库。

https://www.nuget.org/packages/Npgsql/3.0.5

3 个答案:

答案 0 :(得分:2)

在PostgreSQL中,您可以使用数组而不是ID列表,如:

... where id = any('{1, 2, 3}'::int[])

... where id = any(array[1, 2, 3])

表示id是数组项目之一。

Read more about arrays operators and functions.

要将数组作为参数从第三方语言传递,您至少可以使用第一种变体:

... where id = any($1 ::int[])

其中$ 1是一个字符串参数,看起来像{1, 2, 3}。请注意$1::int[]之间的空格 - 某些客户可能需要这样做。

不确定C#是否直接支持数组参数。

答案 1 :(得分:1)

在Postgres中,您可以通过两种方式使用IN运算符:

expression IN (value [, ...])
expression IN (subquery)

阅读文档: first variantsecond variantthis overview

答案 2 :(得分:0)

这是一个使用Dapper和Npgsql在C#中插入的示例-它在临时表中插入1、2、3,然后按有序降序选择它们,因此它将3 2 1打印到控制台。这里的技巧是Postgres unnest()函数,该函数将数组扩展为一组行:

var results = await conn.QueryAsync<int>(@"
    CREATE TEMPORARY TABLE DapperNpgsqlArrayParameterDemo (id int not null primary key);
    INSERT INTO DapperNpgsqlArrayParameterDemo (id) SELECT unnest(@numbers);
    SELECT id from DapperNpgsqlArrayParameterDemo order by id desc;",
    new { numbers = new int[] { 1, 2, 3 } });
foreach(var item in results)
{
    Console.WriteLine($"found {item}.");
}