Ваша основная проблема в том, что ?
не является символом сопоставления с образцом, скорее, _
предназначен для сопоставления с образцом любого отдельного символа и %
предназначен для сопоставления с шаблоном последовательности символов.
SQL как понял SQLite - выражение - операторы LIKE, GLOB, REGEXP и MATCH
Однако , вы также можете столкнуться с проблемами, если 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
);
Окончательный результат будет: -
Aодна строка
mycode
То есть только первый результат подзапроса считается .
Если (null,'mycode'),
будет удалено или закомментировано, то результатом будет: -
Две строки, которые соответствуют теперь первому A%, т.е.
A something
Another
Удаление или комментирование первых двух (null,'mycode'),
и ('A','myothercode'),
приводит к единственной строке: -
Something