是否可以在结果集上使用SQLite模式匹配?

时间:2018-12-18 21:22:31

标签: android sqlite pattern-matching

是否可以将LIKE子句应用于SQLite中的结果集?我要完成的工作如下:

SELECT * 
FROM MyTable 
WHERE value LIKE 
(
    SELECT CASE 
        WHEN prefix IS NOT NULL THEN prefix || '?' 
        ELSE code END
    FROM MyOtherTable
)

在末尾添加?不允许我用前缀进行通配符搜索,而LIKE最终的功能类似于IN子句。

是否有某种方法可以实现这一目标,或者有更好的方法来实现相同的结果?

1 个答案:

答案 0 :(得分:0)

您的主要问题是 ? 不是模式匹配字符,而 _ 是用于任何单个字符和< strong> % 用于匹配一系列字符。

SQL As Understood By SQLite - expression - The LIKE, GLOB, REGEXP, and MATCH operators

但是,如果myOtherTable有多行,您也会遇到问题。

请考虑以下内容:-

DROP TABLE IF EXISTS MyTable;
DROP TABLE IF EXISTS MyOtherTable;
CREATE TABLE IF NOT EXISTS MyTable (value TEXT);
CREATE TABLE IF NOT EXISTS MyOtherTable (prefix TEXT, code TEXT);

INSERT INTO MyOtherTable VALUES 
    (null,'mycode'), 
    ('A','myothercode'),
    ('S',null)
;
INSERT INTO MyTable VALUES
 ('Something'), -- matched by S%
 ('A something'), -- matched by A%
 ('mycode is this'), -- never matched as characters after mycode
 ('Another'), -- matched by A%
 ('mycode') -- matched by mycode
;

-- Intermediate
SELECT CASE 
        WHEN prefix IS NOT NULL THEN prefix || '%' 
        ELSE code END
    FROM MyOtherTable
;

SELECT * 
FROM MyTable 
WHERE value LIKE 
(
    SELECT CASE 
        WHEN prefix IS NOT NULL THEN prefix || '%' 
        ELSE code END
    FROM MyOtherTable
);

最终结果将是:-

单行

mycode

那只是考虑子查询的第一个结果

如果 (null,'mycode'), 被删除或注释掉,结果将是:-

与当前第一个A%相匹配的两行,即

A something
Another

删除或注释掉前两个 (null,'mycode'), ('A','myothercode'), 会在单行中显示:-

Something