如何使用 IN() 来寻找存在?

How to use IN() to search for existence?

我正在使用 Npgsql 连接到 Postgres 数据库,我想运行这样的查询:

 SELECT column IN('foo', 'bar') FROM table;

检查列是否在列表中。

我现在有这个 C# 代码:

var list = new string[] { "foo", "bar" };
var cmd = new NpgsqlCommand("SELECT column IN(:list) FROM table", myConnection);
cmd.Parameters.AddWithValue("list", list);

但这不起作用,因为 Npgsql 从 list 生成了一个 ARRAY,它应该是其他东西,...但是什么?

每个项目都需要作为单独的参数传递。

这些可以通过将您的列表投影到参数中来动态创建:

var list = new string[] { "foo", "bar" };
var parameters = list.Select((x, i) => new NpgsqlParameter($"@item{i}", x));
var cmd = new NpgsqlCommand($@"
    SELECT column IN({string.join(',', parameters.Select(x => x.ParameterName))})
    FROM table", myConnection);
cmd.Parameters.AddRange(parameters);

我使用 ANY 运算符修复了它,因为它需要一个数组:

var list = new string[] { "foo", "bar" };
var cmd = new NpgsqlCommand("SELECT column = ANY(:list) FROM table", myConnection);
cmd.Parameters.AddWithValue("list", list);