Можно ли использовать сопоставление с образцом SQLite в наборе результатов? - PullRequest
0 голосов
/ 19 декабря 2018

Есть ли способ применить предложение 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 голосов
/ 19 декабря 2018

Ваша основная проблема в том, что ? не является символом сопоставления с образцом, скорее, _ предназначен для сопоставления с образцом любого отдельного символа и % предназначен для сопоставления с шаблоном последовательности символов.

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
...