我正在尝试使用_
关键字在应用程序中转义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的这种情况? 谢谢
答案 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
和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$_%