sql用escape关键字转义-like值中出现escape字符怎么办

qhhrdooz  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(374)

我想逃跑 _ 在我的应用程序中使用 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$ 在这种情况下?在我的查询中,转义符可以是值中任何位置的任何字符,而不一定是在结尾。
如何在同一个查询中处理mysql和oracle的这种情况?谢谢

ca1c2owp

ca1c2owp1#

最简单的解决方案是(使用动态sql)测试用户输入并生成两个不同的查询
1) 用于输入 * (即应列出所有申请)

WHERE  APPLICATION is not NULL

这和 APPLICATION LIKE '%' (你可以把它 where 子句是不可为空的列。
2) 对于其他输入,即仅应选择完全匹配的应用程序 = 而不是 like ```
WHERE APPLICATION = '{user input}'

不需要逃跑。
如果出于某种原因要统一查询并使用 `LIKE` 在这两种情况下,必须转义所有通配符和转义符。
匹配输入 `A$` 更改为 `A$$` 匹配输入 `A$_%` 更改为 `A$$$_$%` 例如

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

将匹配字符串

A$_%

a0x5cqrl

a0x5cqrl2#

在这种情况下,它的价值是美元吗?
在这种情况下,最简单的方法是自己检查:

-- 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演示
和甲骨文:

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
rhfm7lfc

rhfm7lfc3#

我不想用通配符查询数据库,通配符在我的应用程序中无效
如果应用程序中的通配符无效,请不要使用like运算符。你只需要转义下划线,因为你有一个喜欢和下划线是一个通配符。使用相等运算,问题就会消失。
这些where子句是等价的:

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

dxpyg8gm4#

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

相关问题