我有一个表,其中的列允许使用特殊字符,例如“/”(正斜杠)和“”(反斜杠)。
现在,当我尝试从表中搜索此类记录时,我无法获取这些记录。
例如:abc\def 或 abc/def
我正在生成一个搜索查询,例如:
select * from table1_1 where column10 like '%abc\def%'
它返回 0 行,但实际上应该返回 1 条记录。在这种情况下我该如何编写查询?
技巧是仅对反斜杠进行双重转义;对于字符串转义,只需要一次转义。
例如
'
只需要转义一次LIKE '%\'%'
\
,你需要双重转义到LIKE '%\\\\%'
\'
那么LIKE '%\\\\\'%'
(有5个反斜杠)解释来源 摘录:
MySQL 在字符串中使用 C 转义语法(例如,“ " 来表示换行符)。如果您希望 LIKE 字符串包含文字“\”,则必须将其加倍。(除非启用了 NO_BACKSLASH_ESCAPES SQL 模式,在这种情况下不使用转义字符。)例如,搜索 ” ",将其指定为“\n”。要搜索“\”,请将其指定为“\\”;这是因为反斜杠被解析器剥离一次,并在进行模式匹配时再次剥离,留下一个反斜杠进行匹配。
例外:在模式字符串的末尾,反斜杠可以指定为“\”。在字符串的末尾,反斜杠代表其自身,因为后面没有任何内容可以转义。
在 MySQL 中,这是有效的:
select * from Table1
where column10 like '%abc\\\\def%'
反斜杠是字符串和
LIKE
模式的转义前缀。因此,对于 LIKE
,您需要将其加倍一次,对于字符串文字语法,需要再次加倍。
你必须用另一个
\
来逃避
\
select * from table1_1 where column10 like '%abc\\def%'
LIKE
值不起作用。经过几次尝试后,有效的是正则表达式(我也必须在那里转义,并将其隐藏在字符类中)。我终于让它像这样工作了:
select * from table1_1 where column10 rlike 'abc[\\]def'
这些不起作用:
... column10 like '%abc\\def%'
... column10 like concat('%abc', char(92), 'def%')
... column10 rlike 'abc\\def'
请注意,您还将此标记为 PL/SQL,即 Oracle。您发布的查询在 Oracle 上按原样运行。 PL/SQL 标签是否有误?
sprintf() 将查询放在您想要的位置:
AND column10 LIKE '%/%'
AND column10 LIKE '%%/%%'