0

我的 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)........

现在我的查询有很多字段(?-->这是我将数据用于过滤器的地方),用户可以在这些字段上查询,所以我正在使用合并但使用合并的缺点是它不会给我空值当我想获取员工表中存在的所有数据时,为了获取空值,我使用了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 查询浏览器来测试我的查询

提前致谢

4

1 回答 1

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,则从过滤器中完全省略,否则将使用传递的值。

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

于 2013-07-16T07:52:41.620 回答