【问题标题】:PostgreSQL: How to create array with empty string in PreparedStatement?PostgreSQL:如何在 PreparedStatement 中使用空字符串创建数组?
【发布时间】:2020-05-22 15:30:37
【问题描述】:

我有一个空名称值的测试表:

create table tmp_table_test (id serial, name varchar(100));

insert into tmp_table_test (name) values ('');
insert into tmp_table_test (name) values ('a');
insert into tmp_table_test (name) values ('b');

当我运行这个查询时:

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN ('', 'a') order by 1;")

我看到两条记录。

现在我想把它改成PreparedStatement,看到同样的记录,但是不知道怎么把空字符串插入到数组中。

我试过了

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN (SELECT unnest(?::text[])) order by 1;", "{'', a}")

或:

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name = ANY (?::text[])", "{'', a}")

但它只返回a 名称的记录。

我试过了:

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN (SELECT unnest(?::text[])) order by 1;", "{, a}")

但它给出了错误:

ERROR: malformed array literal: "{, a}"

我发明的唯一查询看起来很奇怪:

SelectSQLPrepared("SELECT id, name FROM tmp_table_test WHERE name IN (SELECT unnest(string_to_array(?, ','))) order by 1;", ",a")

,a 作为string_to_array() 的参数,它给了我一个空字符串和a 的数组,但是我不知道如何转义输入值中的冒号。

有没有办法使用带有IN子句的prepared statement来搜索空字符串值?

【问题讨论】:

    标签: sql postgresql prepared-statement


    【解决方案1】:

    您可以使用ANY 运算符直接传递一个数组(IN 无论如何都会被重写)并将其转换为准备好的语句源:

    SELECT id, name FROM tmp_table_test WHERE name = any(cast ? as text[]) order by 1
    

    传递一个像{"", a}这样的字符串字面量,例如:

    pstmt.setString(1, "{\"\", a}"
    

    【讨论】:

    • 我很惊讶我必须使用" 而不是“普通”字符串分隔符:',但它可以工作。谢谢。
    【解决方案2】:

    有一个数组构造函数ARRAY

    postgres=# SELECT ARRAY[''];
    ┌───────┐
    │ array │
    ╞═══════╡
    │ {""}  │
    └───────┘
    (1 row)
    
    postgres=# SELECT ARRAY['', 'a'];
    ┌────────┐
    │ array  │
    ╞════════╡
    │ {"",a} │
    └────────┘
    (1 row)
    

    【讨论】:

      猜你喜欢
      • 2013-11-29
      • 2020-05-03
      • 2015-12-20
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2020-07-27
      相关资源
      最近更新 更多