在同一查询中转义Oracle和SQL Server的特殊字符

时间:2019-01-22 10:36:15

标签: sql-server oracle sql-like

我有以下查询:

SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50%'

我必须使用LIKE子句。此查询需要同时在Oracle和SQL Server上运行。

现在有一个问题,因为我想将所有产品的价格降低50%。但是数据可能减少了50.50%。因为'%'是一个特殊字符,所以它们都匹配。

我想转义所有特殊字符,例如查询中的 % ,这样我只能得到减少了50%的产品。

对于Oracle和SQL Server,是否有统一的解决方案以动态方式转义特殊字符?

使用反斜杠不是解决方案,因为实际上我们不知道输入什么。

3 个答案:

答案 0 :(得分:1)

ESCAPE子句在OracleSQL 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子句选择任何内容。

但是如果:

  • 允许用户输入通配符;
  • 您需要使用LIKE;
  • 并且您不希望它们像通配符一样对待;

然后您必须以某种方式逃脱它们。

也许您可以保留一些您知道用户不需要的字符,并使其成为转义字符。

据我所言Oracle you only need to escape the percent (%) and the underbar (_)。 在SQL Server you also have to consider brackets中。

一件好事是,转义看起来不会引起问题,因此即使您不需要在Oracle中使用空格括弧,也可以这样做。