使用ESCAPE关键字进行SQL转义-如果LIKE值中出现转义字符怎么办

时间:2018-08-17 18:44:18

标签: mysql sql oracle escaping character

我正在尝试使用_关键字在应用程序中转义ESCAPE

如果用户输入:A_1我在下划线前添加$,所以最终查询如下:

SELECT APPLICATION AS "APPLICATION"  
FROM  ALARM 
WHERE (((APPLICATION LIKE 'A$_1' ESCAPE '$')))

就我而言,用户可以输入任何内容,如果用户在原始字符串中输入$会发生什么情况?

我之所以使用LIKE关键字是因为我使用的是通配符%,如果用户键入了*,我会将其在服务器中转换为%以用作通配符,除此之外,我不想使用通配符。

如果用户使用_输入字符串,则必须使用与_相同的%(没有通配符)进行搜索

例如,如果我在数据库中有一个名为A$的应用程序,并且用户键入了$,则查询将是:

SELECT APPLICATION AS "APPLICATION"  
FROM  ALARM 
WHERE (((APPLICATION LIKE 'A$' ESCAPE '$')))

在这种情况下,值是否为A$? 在我的查询中,ESCAPE字符可以在值的任何位置,而不必在末尾。

在同一个查询中如何处理MySQL和Oracle的这种情况? 谢谢

4 个答案:

答案 0 :(得分:0)

  

在这种情况下是否将值设为A $?

在这种情况下,最简单的方法是自己检查:

-- MySQL
SELECT 'First', APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION) ALARM   -- mocking data with inline view
WHERE (((APPLICATION LIKE 'A$' ESCAPE '$'))); 
-- will return a match


SELECT 'Second', APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION) ALARM 
WHERE (((APPLICATION LIKE 'A$_' ESCAPE '$')));
-- 0 rows returned

Rextester Demo

和Oracle:

SELECT APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION FROM dual) ALARM
WHERE (((APPLICATION LIKE 'A$' ESCAPE '$')));
-- ORA-01424: missing or illegal character following the escape character


SELECT APPLICATION AS "APPLICATION"  
FROM  (SELECT 'A$' AS APPLICATION FROM dual) ALARM
WHERE (((APPLICATION LIKE 'A$_' ESCAPE '$')));
-- no rows selected

答案 1 :(得分:0)

SELECT * FROM EMPLOYESS WHERE ENAME LIKE '_@_%' ESCAPE '@';

答案 2 :(得分:0)

  

“我不想用任何通配符查询数据库,通配符在我的应用程序中无效”

如果通配符在您的应用程序中无效,请不要使用LIKE运算符。您只需要转义下划线,因为您有LIKE并且下划线是通配符。使用相等运算,您的问题就会消失。

这些WHERE子句是等效的:

where application like 'A$_1' escape '$'
where application = 'A_1' 

答案 3 :(得分:0)

最简单的解决方案是(如使用动态SQL一样)测试用户输入并生成两个不同的查询

1)输入*(即所有应用程序都应列出)

 WHERE  APPLICATION is not NULL

APPLICATION LIKE '%'相同(您可以忽略where子句,因为该列不可为空。

2)用于其他输入,即仅使用=而不是like来选择完全匹配的应用

 WHERE  APPLICATION = '{user input}'

无需转义。

如果您出于某种原因要统一查询并在两种情况下都使用LIKE,则必须转义所有通配符 和转义符。< / p>

要匹配输入A$,请更改为A$$

要匹配输入A$_%,请更改为A$$$_$%

例如

where  APPLICATION LIKE 'A$$$_$%' ESCAPE '$' 

将匹配字符串

A$_%
相关问题