.net PostgreSQL相当于SQL Server的TVP

.net PostgreSQL相当于SQL Server的TVP,.net,postgresql,npgsql,.net,Postgresql,Npgsql,SQL Server具有表值参数,允许您将值数组作为参数传递 实现类似于PostgreSQL查询的功能的合适方法是什么,以便我可以执行以下操作: 从id为$1的产品中选择* 我正在使用Npgsql.NET库 在Postgres中,您可以通过两种方式使用In运算符: expression IN (value [, ...]) expression IN (subquery) 在文件中阅读: ,或。在Postgres中,您可以通过两种方式使用In运算符: expression IN (value

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

实现类似于PostgreSQL查询的功能的合适方法是什么,以便我可以执行以下操作:

从id为$1的产品中选择*

我正在使用Npgsql.NET库


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

expression IN (value [, ...])
expression IN (subquery)
在文件中阅读:
,或。

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

expression IN (value [, ...])
expression IN (subquery)
在文件中阅读:
,或。

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

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

这意味着id是数组的项之一

要将数组作为第三方语言的参数传递,至少可以使用第一个变量:

... where id = any($1 ::int[])
其中$1是一个字符串参数,看起来像{1,2,3}。请注意,$1和::int[]之间的空格-对于某些客户端可能是必需的


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

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

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

这意味着id是数组的项之一

要将数组作为第三方语言的参数传递,至少可以使用第一个变量:

... where id = any($1 ::int[])
其中$1是一个字符串参数,看起来像{1,2,3}。请注意,$1和::int[]之间的空格-对于某些客户端可能是必需的


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

这里有一个使用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}.");
}

下面是一个使用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}.");
}

也许更详细的解释会有所帮助;在你的例子中,1美元是从哪里来的?你能用MS SQL提供一个完整的例子吗?很好@IMSoP,我已经在问题中添加了这个信息。使用.NET库。在PostgreSQL中,您可以使用数组而不是ID列表:。。。其中id=any$1::int[]其中$1是字符串参数,看起来像{1,2,3}不确定C是否直接支持数组参数。@Abelisto哦!我现在就要试一试@阿贝利斯托,那真是太棒了!请加上它作为回答,这样我可以接受。也许更详细的解释会有所帮助;在你的例子中,1美元是从哪里来的?你能用MS SQL提供一个完整的例子吗?很好@IMSoP,我已经在问题中添加了这个信息。使用.NET库。在PostgreSQL中,您可以使用数组而不是ID列表:。。。其中id=any$1::int[]其中$1是字符串参数,看起来像{1,2,3}不确定C是否直接支持数组参数。@Abelisto哦!我现在就要试一试@阿贝利斯托,那真是太棒了!请将其添加为答案,以便我可以接受。我正在尝试找出是否可以作为参数传递。使用TVP的SQL Server,您可以在@ListOfIds的select id中执行where id,否则在PostgreSQL中,我每次都必须使用id列表生成查询。我试图找出是否可以作为参数传递。使用TVP的SQL Server,您可以在@ListOfIds的select id中执行where id,否则在PostgreSQL中,我每次都必须使用id列表生成查询。请注意,Npgsql支持数组类型,因此您完全可以从CNote执行上述操作。Npgsql支持数组类型,因此您完全可以从C执行上述操作