【问题标题】:setting null to parameter in select sql statement在select sql语句中将null设置为参数
【发布时间】:2019-04-09 08:55:09
【问题描述】:

我需要帮助,因为我正在努力将 null 作为参数分配给我的 java 程序中的 select 语句。

我的脚本从 csv 文件中读取值,然后根据提供的索引选择参数。但是,这些值有时是空字符串,例如(1,,3) 因此它会从索引 1 中选择空字符串并尝试将其设置为 sql 语句中的参数,这不会达到我想要的结果。

并且我们知道 sql 使用以下语法处理 select 语句中的空值: 例如 select * from tablename where a IS NULL.

在以下情况下最好将值设置为 null:

select * from tableName where abc=? 
stmt2.setString(1, csvVal.get(index));

【问题讨论】:

    标签: java sql oracle select setstring


    【解决方案1】:

    您必须使用单独的PreparedStatement#setNull 方法将参数值设置为NULL

    if(csvVal.get(index) == null){
        stmt2.setNull(1, java.sql.Types.NVARCHAR ); // Or whatever data type your column is
    }else{
        stmt2.setString(1, csvVal.get(index));
    }
    

    编辑:我原来的答案是不完整的。您还必须修改查询,因为 NULL = NULL 将始终返回 false。

    --use a variable to avoid multiple stmt2.set... calls
    DECLARE @nullCheck NVARCHAR(MAX) = ? -- Or whatever data type your column is
    SELECT *
    FROM tableName
    WHERE abc = @nullCheck -- if you don't want the null values
    OR (abc IS NULL -- only get the records if both the column and the parameter are NULL
        AND
        @nullCheck IS NULL)
    

    【讨论】:

    • 这似乎不起作用,因为当参数为null时,sql结果返回false。但是,在 sql 查询编辑器中,相同的 sql 会取回结果。字符串暗淡=""; String crazyURL = "select * from tableName where dim10=?"; stmt2 = con.prepareStatement(crazyURL); if(dim.equals("")) { stmt2.setNull(1, java.sql.Types.NVARCHAR ); } 其他 { stmt2.setString(1, 暗淡); }
    • @RashidKhan 我很抱歉。我的回答不完整。请参阅我的编辑以获取修改 SQL 查询的指南。
    • 感谢@mypetlion 对此的回复。你能告诉我应该在哪里指定:DECLARE @ nullCheck NVARCHAR(MAX) = 吗? Java 无法识别上述语法,除非我遗漏了什么
    • @RashidKhan crazyURL 变量中的所有内容。所以它应该看起来像:String crazyURL = "DECLARE @nullCheck NVARCHAR(MAX).....(the rest of your query)";
    • @RashidKhan 抱歉,我习惯了 MSSQL,但我现在看到您使用的是 Oracle。我现在要编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多