在同一查询中转义 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 '\'
我有以下查询:
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 '\'