是否可以将LIKE
子句应用于SQLite中的结果集?我要完成的工作如下:
SELECT *
FROM MyTable
WHERE value LIKE
(
SELECT CASE
WHEN prefix IS NOT NULL THEN prefix || '?'
ELSE code END
FROM MyOtherTable
)
在末尾添加?
不允许我用前缀进行通配符搜索,而LIKE
最终的功能类似于IN
子句。
是否有某种方法可以实现这一目标,或者有更好的方法来实现相同的结果?
答案 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