如何使用 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);
我正在使用 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);