【问题标题】:sql sentence with wildcards and null values带有通配符和空值的sql语句
【发布时间】:2013-03-18 20:31:48
【问题描述】:

我有 4 个带有值的组合框,也可以是通配符“%”。 如您所知,不会返回 NULL 值。

我使用了(COLUMN_NAME LIKE 'VALUE' OR COLUMN_NAME IS NULL),它以某种方式工作,但这不是我需要的。 例如,在这种情况下,我需要返回 NULL 值:

NAME = '%'
LASTNAME = '%'
ZIPCODE = '12345'
EMAIL = '%'

基本上,我希望它返回所有邮政编码,如“12345”以及其他 3 个(姓名、姓氏、电子邮件)的空值。

不知道我说的是否清楚:(

如果我不是,请告诉我,

我怎样才能做到这一点? 提前致谢。

【问题讨论】:

  • 根据需要的参数动态创建你的sql
  • 你的SQL部分不清楚。您是要在 Java 代码中构建自定义查询(SQL 语句),还是需要可以涵盖所有用例的“通用”查询?

标签: java sql null wildcard


【解决方案1】:

在您的 SQL 语句中使用 LIKE 运算符。根据您的数据库,使用 NVL,ISNULL,IFNULL。

甲骨文; NVL(NAME,' ') LIKE '%'
MSSQL; ISNULL(LASTNAME,' ') LIKE '%'
MySQL; IFNULL(EMAIL,' ') LIKE '%'

并使用准备好的语句。不要使用合并字符串值构建 SQL 语句。防止 SQL 注入。

【讨论】:

    【解决方案2】:

    如果你不关心值是什么,也不关心它是否是null,那么甚至不要在where子句中包含该列:

    where zipcode = '12345'
    

    另外,我猜您的 '%' 值是由于用户选择不按该值进行搜索的结果。我会在您的程序中以不同的方式表示,可能使用 Java null 或空字符串“”,因此 '%' 的含义仍可能更接近 SQL “like” where 子句片段中的含义——任何值除了null。

    【讨论】:

    • 就是这样,对不起实际上不是java。这些是 html (jsp spring) 组合框。因此,当我单击一个 javascript 函数时,该函数会将所有值发送到 ESB,并发送到流中的预构建 SQL 查询。
    • 不,当然,“where zipcode = '12345'”不是 Java。这就是你的 where 子句在 SQL 中的样子。
    • 是的,我的 SQL 执行如下操作 SELECT COL1, COL2, COL3 WHERE (COL1 LIKE #[json:VALUE1] OR COL1 = NULL) AND (COL2 LIKE #[json:VALUE2] OR COL2 = NULL) AND (COL3 LIKE #[json:VALUE3] OR COL3 = NULL) 但这不符合我的需要,即使它有效。碰巧我关心其他空值。就像执行以下操作: SELECT * FROM TABLE WHERE COL1 LIKE VALUE1;这将返回 col1 类似于 value1 的所有行以及其他列的空值。这就是我想要的通配符。
    【解决方案3】:

    这是你要找的 -

        (lastname_col like :lastname or :lastname = '%' ) and 
        (zipcode_col like :zipcode or :zipcode = '%' ) and  
        and so on
    

    即使 :zipCode 为 '12345' 且其余值为空,上述 sql 也应该为您提供结果。

    【讨论】:

    • 是的,我对 rgettman 说这是我当前的查询:SELECT COL1、COL2、COL3 WHERE (COL1 LIKE #[json:VALUE1] OR COL1 = NULL) AND (COL2 LIKE #[json: VALUE2] OR COL2 = NULL) AND (COL3 LIKE #[json:VALUE3] OR COL3 = NULL) 但是,这与您的示例相同,假设所有通配符除了邮政编码为 1234,这将返回所有邮政编码为 1234 和 NULL 的。好吧,这就是我不想要的,不要为你搜索过的返回 null。
    • 如果我理解正确,myy 的查询与您的有点不同。你的是(COL1 LIKE #[json:VALUE1] OR COL1 = NULL)。我的是(COL1 LIKE #[json:VALUE1] OR #[json:VALUE1] = NULL)。你看到差异了吗?
    • 是的,但在我的情况下,#[json:VALUE] 不会为空,而是 '%'。 :( 所以这种情况永远不会发生(在我的情况下)(#[json:VALUE] 是从 JSP 以 json 格式传递给 ESB 的值。)可能的值 = 字符串或通配符。
    • 我已经编辑了答案,可以吗?基本上将条件更改为 (COL1 LIKE #[json:VALUE1] OR #[json:VALUE1] = '%')
    • 没有返回任何 NULL 值 :(
    猜你喜欢
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 2017-06-19
    相关资源
    最近更新 更多