Android room 当在搜索查询中仅输入 % 时,它会返回所有结果

问题描述 投票:0回答:1

当我在搜索查询室中输入“%”时,会返回所有结果 查询示例 SELECT * FROM table WHERE field LIKE '%' || :搜索|| '%'

当我将 % 放入搜索查询中时,我只需要包含此特殊符号的元素。

android android-room
1个回答
0
投票

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)中运行上述结果:-

  1. result of first query
    1. 即根据问题的所有行
  2. second
    1. 即仅在 v 列中有 % 的行
  3. third
    1. 即仅包含@%
    2. 的行
© www.soinside.com 2019 - 2024. All rights reserved.