我有一个html5查询可以正常工作:
tx.executeSql('SELECT *
FROM bdreminders
WHERE firstname = IFNULL(?, firstname)
AND lastname = IFNULL(?, lastname)
AND baughtgift = IFNULL(?, baughtgift)
ORDER BY firstname asc',
[passedfn,passedln,passedbg],renderFunc,birthdayapp.onError);
但是,我想使用“like”运算符而不是“=”但不知道如何使用IFNULL
来实现它。
答案 0 :(得分:0)
整个IFNULL(?,xxx)
构造应该返回一个值。
您应该能够在LIKE
运算符中使用此值,就像您将其与=运算符一起使用一样。
答案 1 :(得分:0)
如果只是用LIKE运算符替换'=',您将获得与当前查询完全匹配的答案。我假设您想使用LIKE运算符执行不同的操作(例如以搜索开头)。
我为您提供了SQL数据库通常如何执行此操作,但是如果这适用于您,则取决于SQL5与HTML5引擎使用的SQL方言的兼容性。
首先,它取决于concaternation语法。其次,它依赖于使用NULL + string生成NULL或字符串的concaternation。大多数专业数据库都会产生NULL(这对你有好处,因为这样会有效)。
以下内容适用于MySQL或Oracle以及其他一些数据库:
SELECT * FROM bdreminders
WHERE firstname LIKE IFNULL( CONCAT(?,'%'), firstname)
AND lastname LIKE IFNULL( CONCAT(?,'%'), lastname)
AND baughtgift LIKE IFNULL( CONCAT(?,'%'), baughtgift)
ORDER BY firstname asc
或(对于Oracle,Postgre和其他人)
SELECT * FROM bdreminders
WHERE firstname LIKE IFNULL( ? ||'%', firstname)
AND lastname LIKE IFNULL( ? || '%', lastname)
AND baughtgift LIKE IFNULL( ? || '%', baughtgift)
ORDER BY firstname asc
或(对于SQL服务器和其他人)
SELECT * FROM bdreminders
WHERE firstname LIKE IFNULL( ? +'%', firstname)
AND lastname LIKE IFNULL( ? + '%', lastname)
AND baughtgift LIKE IFNULL( ? + '%', baughtgift)
ORDER BY firstname asc
我会先尝试最后一个。如果以上操作不起作用并且您获得所有bdreminders,则数据库不会将NULL + string挂接到NULL。在这种情况下,我认为您不能使用ISNULL,因为它将返回第一个非null值,因此始终返回'%'。