当我在搜索查询室中输入“%”时,会返回所有结果 查询示例 SELECT * FROM table WHERE field LIKE '%' || :搜索|| '%'
当我将 % 放入搜索查询中时,我只需要包含此特殊符号的元素。
A
%
,因为它是 LIKE 子句的运算符,必须进行 ESCAPE
处理,以便将其视为文字值而不是嵌入运算符。
这可以通过使用
ESCAPE
关键字来实现,后跟定义 escape 字符的表达式。
例如,如果存储的值是
abcdef%
并且要搜索的文字值是 %
,则不要使用 LIKE '%'||:search||'%'
(其中搜索是 %
)。您需要更改搜索的值以包含前缀“%”的转义字符。
如果所选的转义字符是
@
,那么您可以将 %
替换为搜索值的 @%
,并包含 ESCAPE
子句。
例如
LIKE '%'||:search||'%' ESCAPE '@'
由于转义字符本身可以转义,您可能希望考虑首先用 2 个转义字符(相当于其本身)替换转义字符,然后用转义的
%
(%
) 替换 @%
。
所以说搜索值是
A@%
,那么它会首先更改为A@@%
(即转义字符已被转义),然后更改为A@@@%
,以便%
也被转义。
这是使用原始 SQL 的演示(可以在 SQLite 工具中使用):-
DROP TABLE IF EXISTS t;
CREATE TABLE IF NOT EXISTS t (v TEXT);
/* insert some data for testing */
INSERT INTO t VALUES ('abcdef%'),('xyz'),('a@%');
SELECT * FROM t WHERE v LIKE '%'||'%'||'%'; /* AS per the question i.e. % is considered operator not literal value */
SELECT * FROM t WHERE v LIKE '%'||'@%'||'%' ESCAPE '@'; /* now the % has been escaped */
SELECT * FROM t WHERE v LIKE '%'||'@@@'||'%' ESCAPE '@'; /* now the escape character has also been escaped as well as the %*/
DROP TABLE IF EXISTS t; /* cleanup testing environment */
在 SQLite 工具(使用 Navicat for SQLite)中运行上述结果:-