Как передать параметр в оператор sql 'in'? - PullRequest
13 голосов
/ 18 апреля 2011

Я хочу создать этот запрос:

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);

но это не сработало;)

Ответы [ 3 ]

27 голосов
/ 18 апреля 2011

Передать его как массив:

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 голос
/ 18 апреля 2011

Вам нужно динамически создать командную строку - цикл с вашим первым параметром как: num0, вторым как: num1 и т. Д. Когда вы добавите все из них, удалите последний символ "," и замените его на ")" .

0 голосов
/ 23 июня 2015

В дополнение к ответу @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);
...