Как передать параметр в sql 'in'?

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

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

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

Ответ 1

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

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

Ответ 2

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

Ответ 3

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