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

Escape special characters for Oracle and SQL Server in the same query

我有以下查询:

SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50%'

我需要使用 LIKE 子句。此查询需要 运行 在 Oracle 和 SQL 服务器上。

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

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

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

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

The ESCAPE clause identifies the backslash (\) as the escape character

SELECT *
FROM PRODUCTS
WHERE REDUCTION LIKE '50\%'

你需要类似上面第一个答案的东西,但你不需要使用 \ 作为转义符。您可以使用 ESCAPE 子句选择任何您想要的。

但是如果:

  • 允许用户输入通配符;
  • 并且你需要使用 LIKE;
  • 并且您不希望将它们视为通配符;

那你就得想办法躲开他们。

或许您可以保留一些您知道用户不需要的字符并将其设为转义字符。

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

好处是过度转义看起来不会引起问题,因此即使您不需要在 Oracle 中对括号进行空格,这样做也是可以的。

ESCAPE 子句适用于 Oracle and 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 '\'