如何处理参数化查询中的空用户输入?

时间:2018-01-08 18:39:12

标签: javascript sql oracle web-applications

假设我在我的网络应用程序中的某个地方有以下查询模板:

`WHERE UPPER(NAME) LIKE UPPER('%${NAME}%') AND UPPER(LASTNAME) LIKE UPPER('%${LASTNAME}%')`

现在,如果用户在其中一个字段的应用程序中输入空值,是否会影响查询结果?

这可以通过应用程序通过分解查询并在使用ifs执行期间构建它来解决,但对于某些查询,这会使应用程序代码过于复杂。

有没有办法在模板内部解决这个问题?仅使用SQL语言而不是应用程序逻辑。

如果我不解决它,如果我只是用空输入查询,那会不会影响我的表现? oracle是否有智能不查询空输入?

基本上:查询NAME LIKE '%%'之类的内容有多糟糕? Oracle会忽略这部分查询还是会影响性能(我希望它被忽略,因为这是用户没有在表单中输入任何内容的结果)?这是一个简单的例子,但是有更复杂的例子有嵌套查询。

这是一种懒惰的方式来处理用户没有在申请表格中输入任何价值,让我们说他将name字段留在表格中,在这种情况下我想要所有{{1无需构建新模板即可在查询中使用。

标记为Javascript,因为它是应用程序语言。

2 个答案:

答案 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