有没有一种方法可以使用WHERE子句查询SQLite数据库,而该子句并不总是设置所有属性?

时间:2019-11-15 21:48:14

标签: java sql database sqlite where-clause

我正在构建Java桌面应用程序,并将SQLite用于我的数据库。

我希望用户能够根据多个参数组合看到同一张表中的结果,但是他们还可以选择为其选择“全部”。

例如,如果我有一个包含“名称,年龄,品种”列的“狗”表,我希望用户能够看到所有狗或所有具有特定年龄的狗,或者具有特定品种的所有狗,或者具有一定年龄和品种。

是否可以在同一函数中编写所有这些代码,还是必须为每种参数组合构建一个单独的函数?

编辑 我用示例数据库的照片和我要运行的查询来更新我的问题,由@Vikdor的答案建议 Database

    SELECT * FROM Dogs
WHERE
 CASE "" 
    when null then 1=1
    else name="" 

END

OR

CASE ""
    when null then 1=1
    else age=""
END

OR

CASE ""
    when null then 1=1
    else breed=""
END

在CASE语句之间不使用AND或OR都无法提供所需的结果。 例如,当我使用OR并将过滤器应用于最后两列时,

SELECT * FROM Dogs
WHERE
 CASE "" 
    when null then 1=1
    else name="" 

END

OR

CASE "12"
    when null then 1=1
    else age="12"
END

OR

CASE "GR"
    when null then 1=1
    else breed="GR"
END

Output with OR

当然,它与12岁或具有GR的狗成排。 另外,当未指定过滤器时(所有列的CASE参数为“”),都不会返回任何行,尽管在这种情况下,我想返回所有行。

使用AND,无论过滤器是什么,我都不会得到任何行。

1 个答案:

答案 0 :(得分:1)

您可以使用SQLite CASE表达式并对其进行构造,以便在指定过滤器时应用该过滤器,而在未指定过滤器的情况下,WHEN子句返回true

例如

SELECT * FROM demo
WHERE
case "SQL"
    when null then 1 = 1
    else name = "SQL"
END
OR
case "Create public link DB"
    when null then 1 = 1
    else hint = "Create public link DB"
END

在上面的示例中,用应该从Java程序传递的参数替换CASE表达式中的“ SQL”常量(您将使用PreparedStatementCallableStatement还是用值替换那些参数,对吧?)