由于我们无法控制的情况(换句话说,使用第三方编写的代码),我们发现自己需要将带有内联值的SQL语句重写为预处理语句。现在,我们正在使用一组可怕的正则表达式来捕获大多数情况,但仍然在一些情况下失败(并且通常会失败,产生无效的SQL)。
看起来我们需要实际解析SQL,代替“?”显式字符串和数值的参数,并将注入的值收集到新准备的语句中。
以下是我们正在处理并希望重写的“毛茸茸”的SQL类型的示例:
rewrite from
SELECT COL1 FROM TB1 WHERE LOWER(COL2) = LOWER('foo bar ' || '&' || ' Abc(' || '''' || ')')
AND COL3 = 2 AND COL4 = 1
to
SELECT COL1 FROM TB1 WHERE LOWER(COL2) = LOWER(? || ? || ? || ? || ?)
AND COL3 = ? AND COL4 = ?
applied to ("foo bar ", "&", " Abc(", "'", ")", 2, 1)
答案 0 :(得分:0)
1)您可以创建temproray表(会话时间,内存基础 - 如您所愿)以填充您需要的值(以小写字母表示,以达到性能目的)。
SELECT t1.COL1
FROM TB1 t1
INNER JOIN TEMP_TABLE t2 ON ( t2.val = LOWER(t1.COL2) )
WHERE t1.COL3 = ? AND t1.COL4 = ?
2)如果您使用MySQL并且搜索的值不包含逗号,您可以使用“find_in_set”函数:
SELECT COL1
FROM TB1 t1
WHERE FIND_IN_SET( LOWER(t1.COL2), ? )
AND t1.COL3 = ? AND t1.COL4 = ?
applied to ("foo bar,&,Abc(,',)",2,1