假设我在我的网络应用程序中的某个地方有以下查询模板:
`WHERE UPPER(NAME) LIKE UPPER('%${NAME}%') AND UPPER(LASTNAME) LIKE UPPER('%${LASTNAME}%')`
现在,如果用户在其中一个字段的应用程序中输入空值,是否会影响查询结果?
这可以通过应用程序通过分解查询并在使用ifs执行期间构建它来解决,但对于某些查询,这会使应用程序代码过于复杂。
有没有办法在模板内部解决这个问题?仅使用SQL语言而不是应用程序逻辑。
如果我不解决它,如果我只是用空输入查询,那会不会影响我的表现? oracle是否有智能不查询空输入?
基本上:查询NAME LIKE '%%'
之类的内容有多糟糕? Oracle会忽略这部分查询还是会影响性能(我希望它被忽略,因为这是用户没有在表单中输入任何内容的结果)?这是一个简单的例子,但是有更复杂的例子有嵌套查询。
这是一种懒惰的方式来处理用户没有在申请表格中输入任何价值,让我们说他将name
字段留在表格中,在这种情况下我想要所有{{1无需构建新模板即可在查询中使用。
标记为Javascript,因为它是应用程序语言。
答案 0 :(得分:1)
1)不要用用户输入直接生成SQL,否则你将被黑客入侵。搜索" SQL注入" - 仍然是各地黑客的首选方法。
2)一旦你有绑定变量以避免被黑客入侵,你的SQL语句可以只是:
where ( :first_name is null or name like :first_name )
and ( :last_name is null or name like :last_name )
and ...
如果您选择这样做,绑定变量包含前导和尾随%符号。优化器自然会过滤掉那些为空的参数。
答案 1 :(得分:0)
在MS SQL中,我使用这种方法:
DECLARE @NAME NVARCHAR(100) = NULL
DECLARE @LASTNAME NVARCHAR(100) = '%XYZ%'
select *
from CUSTOMER
WHERE UPPER(LASTNAME) LIKE case when UPPER(@NAME) is null then UPPER(LASTNAME) else UPPER(@NAME) end
AND UPPER(FIRSTNAME) LIKE case when UPPER(@LASTNAME) is null then UPPER(FIRSTNAME) else UPPER(@LASTNAME) end
它给了我这个结果
LASTNAME FIRSTNAME
xyz xyz