我需要从数据库中提取数据。 查询是 -
SELECT e.Data AS EntityBlob, f.Data AS FpmlBlob
FROM [Trades.InventoryRecord] ir, EntityBlob e, FpmlBlob f
WHERE %s AND uid = e.uid AND uid = f.uid
这里%s是用户从html表单输入的where子句之后的谓词。
用户输入将采用以下形式:
1. TradeDate ='2013-04-05
'和IsLatest ='TRUE'
2. StreamId ='IA0015
'
3.查询也可以有IN子句
现在,当呈现此查询时,我得到异常ambigous列streamId或ambigous列IsLatest,因为这些列存在于具有相同名称的多个表中。因此,为了消除这种歧义,我需要将查询修改为 - ir.IsLatest或ir.StreamId
要通过java代码执行此操作,我需要首先在where子句之后解析谓词,提取列名并在每个列名之前插入表名alias-'ir',以便查询变为 -
SELECT e.Data AS EntityBlob, f.Data AS FpmlBlob
FROM [Trades.InventoryRecord] ir, EntityBlob e, FpmlBlob f
WHERE ir.TradeDate = '2013-04-05' AND ir.IsLatest = 'TRUE' AND uid = e.uid AND uid = f.uid
解析这个谓词的最佳方法是什么,或者如果有其他方法可以达到相同的结果?
答案 0 :(得分:0)
我对这个问题的回答是不解析用户输入 - 远太多可能出错。拥有一个带有下拉菜单的UI和用于选择相等,不等式,范围,语句等的按钮会好得多。看起来更像是工作,但保护自己免受SQL注入攻击更是如此。即使您不关心恶意SQL注入,用户仍然必须使所有完全正确,或者语句失败。