【问题标题】:How to pass parameter to sql 'in' statement?如何将参数传递给 sql 'in' 语句?
【发布时间】:2011-08-07 18:32:46
【问题描述】:

我想创建这个查询:

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

但它没有工作;)

【问题讨论】:

    标签: c# postgresql ado.net npgsql


    【解决方案1】:

    2021 年的更新答案:

    你可以像这样使用ANY

    WHERE id = ANY (@ids)
    

    然后,当您添加参数时,请执行以下操作:

    cmd.Parameters.AddWithValue("ids", ids.ToArray());
    

    【讨论】:

      【解决方案2】:

      使用“从测试中删除 id IN (select unnest(@ids))”

      【讨论】:

        【解决方案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);
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

          • 如果你可以按照 Quassnoi 建议的方式使用数组,我会同意的。
          【解决方案5】:

          将其作为数组传递:

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

          【讨论】:

          • 这会产生错误:你的array变量在参数值中应该是numbers
          • @UwConcept:老实说,我上次使用NPgSQL 已经很久了,甚至没有安装VS 来检查:)
          • @Adrian: 语法没问题还是你必须改正?我无法检查。
          • 使用 NpgsqlDbType | NpgsqlDbType.Numeric 如果你传递一个 int[]。我也认为它的 $numbers 不是:numbers?除此之外,语法对我有用。
          猜你喜欢
          • 1970-01-01
          • 2012-03-12
          • 2012-05-09
          • 2011-06-11
          • 2013-03-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多