我有以下查询:
SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50%'
我必须使用LIKE子句。此查询需要同时在Oracle和SQL Server上运行。
现在有一个问题,因为我想将所有产品的价格降低50%。但是数据可能减少了50.50%。因为'%'是一个特殊字符,所以它们都匹配。
我想转义所有特殊字符,例如查询中的 %
,这样我只能得到减少了50%的产品。
对于Oracle和SQL Server,是否有统一的解决方案以动态方式转义特殊字符?
使用反斜杠不是解决方案,因为实际上我们不知道输入什么。
答案 0 :(得分:1)
ESCAPE
子句在Oracle和SQL Server中起作用。
对于您的输入,您需要用%
替换所有出现的\%
(最好在将值传递给RDBM之前)。您还可以在查询中执行此操作,因为幸运的是,Oracle REPLACE
和SQL Server REPLACE
函数具有相似的签名:
CREATE TABLE tests(test VARCHAR(100));
INSERT INTO tests VALUES('%WINDIR%\SYSTEM32');
SELECT *
FROM tests
WHERE test LIKE REPLACE(REPLACE('%WINDIR%\SYSTEM32', '\', '\\'), '%', '\%') ESCAPE '\'
答案 1 :(得分:0)
ESCAPE子句将反斜杠(\)标识为转义字符
SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50\%'
答案 2 :(得分:0)
您将需要类似上面第一个答案的内容,但是您不需要使用\
作为转义符。您可以使用ESCAPE
子句选择任何内容。
但是如果:
然后您必须以某种方式逃脱它们。
也许您可以保留一些您知道用户不需要的字符,并使其成为转义字符。
据我所言Oracle you only need to escape the percent (%) and the underbar (_)。 在SQL Server you also have to consider brackets中。
一件好事是,转义看起来不会引起问题,因此即使您不需要在Oracle中使用空格括弧,也可以这样做。