【问题标题】:Java native SQL query to display all values when an input param is null当输入参数为空时显示所有值的 Java 原生 SQL 查询
【发布时间】:2016-12-25 22:36:53
【问题描述】:

我有以下DAO方法:

public String getSomeTable(final String param1) {
    String sqlString = "select * from table where name ilike ?";
    Query query = this.getEntityManager().createNativeQuery(sqlString);

    query.setParameter(1, "%param1%");
}

如果param1null 或为空,那么我想从表中选择所有条目。这样做的正确方法是什么?我目前正在使用以下内容:

public String getSomeTable(final String param1) {
    String sqlString = "select * from table where name = ?";
    Query query = this.getEntityManager().createNativeQuery(sqlString);

    if(param1 == null)
        query.setParameter(1, "%%");
    else
        query.setParameter(1, "%param1%");
}

但这不可扩展。我有整数、日期等数据类型。如果它是null,我想知道是否有办法跳过检查该参数。

我打算使用 COALESCE(?, CASE WHEN ? = '' THEN '%%' ELSE '%?%') 但我认为?对于特定参数,只能使用一次。下一个 > 我写的链接到第二个参数。

【问题讨论】:

  • 该表是否允许空列值?如果是,是否需要将查询更改为:select * from table where name is null
  • 您使用的是哪个数据库?
  • 是的,该表允许 NULL 值。
  • 我正在使用 Postgres

标签: java sql postgresql eclipselink nativequery


【解决方案1】:

在 SQL Server 上,我使用这样的东西,也许你可以把它翻译成 postgres:

DECLARE @variable INT = NULL;

SELECT *
FROM sysobjects
WHERE 
(1 = CASE WHEN @variable IS NULL THEN 1 ELSE 2 END)
OR
(id LIKE @variable);

【讨论】:

  • 为什么不简单点:WHERE @variable IS NULL OR id = @variable?
  • @Shnugo - 或者更简单:WHERE id = COALESCE(@variable,id)?
  • 这是我的第一个想法,显然还有更简单的。
  • @Nicarus,这个谓词不会像您期望的那样使用索引。阅读关于 sargable...
  • @Shnugo - 在这种情况下似乎是安全的,因为此列上可能没有索引(请参阅问题)。
猜你喜欢
  • 2017-01-06
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
相关资源
最近更新 更多