如何将参数传递给sql'in'语句?

时间:2011-04-18 10:23:31

标签: c# postgresql ado.net npgsql

我想创建此查询:

select * from products where number in ('123', '234', '456');

但我找不到任何使用Npgsql和NpgsqlParameter实现此功能的示例。我试过这样:

string[] numbers = new string[] { "123", "234" };

NpgsqlCommands cmd = new NpgsqlCommands("select * from products where number in (:numbers)");
NpgsqlParameter p = new NpgsqlParameter("numbers", numbers);
command.Parameters.Add(p);

但它不起作用;)

4 个答案:

答案 0 :(得分:27)

将其作为数组传递:

string[] numbers = new string[] { "123", "234" };

NpgsqlCommands cmd = new NpgsqlCommands("select * from products where number = ANY(:numbers)");
NpgsqlParameter p = new NpgsqlParameter("numbers", NpgsqlDbType.Array | NpgsqlDbType.Text);
p.value = numbers;
command.Parameters.Add(p);

答案 1 :(得分:1)

您需要动态创建命令字符串 - 使用您的第一个参数循环:num0,second as:num1等。当您添加所有这些参数时,删除最后一个字符“,”并将其替换为“)”

答案 2 :(得分:0)

除了@Quassnoi回答之外,我还要添加一个来展示,我们是如何在实际代码中完成的。

警告!这个工作代码来自真实的项目,可能会破坏你的美丽方法!

string commstr = "SELECT product_name, price, product_url, image_url FROM products WHERE id  = ANY(@arr);";
NpgsqlCommand cm = new NpgsqlCommand(commstr, cn);
NpgsqlParameter arpar = new NpgsqlParameter();
arpar.ParameterName = "arr";
arpar.NpgsqlDbType = NpgsqlDbType.Array | NpgsqlDbType.Bigint;
arpar.Value = PerformQuerySphinx(query, limit);
cm.Parameters.Add(arpar);

答案 3 :(得分:0)

使用“从测试中删除ID IN(选择unnest(@ids))的地方”