【问题标题】:COALESCE() to get Not null as well as NULL ValuesCOALESCE() 获取 Not null 以及 NULL 值
【发布时间】:2013-07-14 07:10:14
【问题描述】:

我的 Mysql 查询为:

select RecordID,ID,Name,Description,RecordDateTimeUTC,Location from
eemployee where RecordID like ? and(isNull(RecordDateTimeUTC) OR RecordDateTimeUTC=  CASE  WHEN COALESCE(?,'') = ''  THEN RecordDateTimeUTC  ELSE ?  END)........

现在我的查询有很多字段(?-->这是我将我的数据用于过滤器的地方)用户可以查询,所以我使用 coalesce 但使用的缺点coalesce当我想获取员工表中存在的所有数据时它不会给我空值,所以为了获取空值我使用了 isNull 功能。

现在我正在为两个用例测试上述查询

1-->用户可以在 RecordID 中传递百分比:-在这种情况下,他应该获取所有数据,无论是空值还是非空值:

    select RecordID,ID,Name,Description,RecordDateTimeUTC,Location from
        eemployee where RecordID like '%' 
and(isNull(RecordDateTimeUTC) OR RecordDateTimeUTC=  CASE  WHEN COALESCE('','') = ''  THEN RecordDateTimeUTC  ELSE ''  END)

2-->用户可以根据RecordDateTimeUTC过滤数据:-如果用户传递了这个参数,那么他应该得到满足上述过滤条件的所有非空数据。:-

select RecordID,ID,Name,Description,RecordDateTimeUTC,Location from
        eemployee where RecordID like '%' and(isNull(RecordDateTimeUTC) OR RecordDateTimeUTC=  CASE  WHEN COALESCE('2012-07-09 11:11:00','') = ''  THEN RecordDateTimeUTC  ELSE '2012-07-09 11:11:00'  END)

对于第一个用例,它工作正常,但对于第二个用例,它给我过滤数据以及空数据

那么我的查询应该是什么,以便上述单个查询支持我的两个用例。 我正在使用 MYSQl 查询浏览器来测试我的查询

提前致谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

    看起来您正在尝试在使用单个静态 SQL 语句时使参数成为可选参数。在那种情况下,我想你的意思是:

    SELECT RecordID,ID,Name,Description,RecordDateTimeUTC,Location 
    FROM eemployee 
    WHERE (@RecordId IS NULL OR RecordID LIKE @RecordId)
    AND (@RecordDateTimeUTC IS NULL OR RecordDateTimeUTC = @RecordDateTimeUTC)
    

    如果参数值为NULL,则从过滤器中完全省略,否则将使用传递的值。

    注意你不能在这里使用?,因为需要重复使用参数——除非你想指定每个参数两次,也就是说。指定名称使查询更易读恕我直言。

    【讨论】:

    • 感谢您的回复。我已根据您的建议修改了我的查询,它看起来像这样 SELECT RecordID,ID,Name,Description,RecordDateTimeUTC,Location FROM eemployee WHERE (@RecordId IS NULL OR RecordID LIKE '%') AND (@RecordDateTimeUTC IS NULL OR RecordDateTimeUTC = '2012-07-09 11:11:00')。但为此,我得到 Null 值以及包含 RecordDateTimeUTC 的“2012-07-09 11:11:00”的值
    • 所以你的意思是我应该在你提到@parameterName的地方传递数据
    • 是的,或者您应该定义参数并使用它们。 (如果你要用内联数据替换参数,你也可以动态地创建查询。)
    • 你能举个例子吗
    • 我不知道你是怎么称呼它的,但是你要么想为 @RecordId 和/或 @RecordDateTimeUTC 参数指定值(如果你正在使用同样的方式添加参数?,但只需确保给它们命名),否则您可能希望根据用户的输入构造 SQL 查询。
    猜你喜欢
    • 1970-01-01
    • 2014-12-31
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多