Sqlite - создание запроса для поиска - начинается с включения - PullRequest
2 голосов
/ 22 апреля 2019

Я пытаюсь создать запрос в sqlite, который будет возвращать: Начинается с, а затем включает

Итак, "bou" вернется:

Отказы
Отскочить назад
Обо мне
Думая о тебе
и т.д.

Я попытался объединить запросы, используя объединения с LIKE 'search%' и LIKE '% search%', с ORDER BY и без него, но я не могу понять это. Я надеялся на что-то быстрое и эффективное, за исключением создания 2 разных запросов / результатов и объединения вручную. Есть идеи? Спасибо

1 Ответ

1 голос
/ 23 апреля 2019

Я считаю, что следующее может делать то, что вы хотите, или что-то близкое к тому, что вы хотите: -

WITH cte1(search_item) AS (SELECT 'bou') -- <<<<<<<<<< search argument
SELECT 
    CASE
        WHEN mytext LIKE (select search_item FROM cte1)||'%'
            THEN mytext||' - begins with '||(select search_item FROM cte1)
        ELSE 
            mytext||' - includes '||(select search_item FROM cte1)
    END AS phrased,
    mytext
FROM mytable 
WHERE mytext LIKE '%'||(select search_item FROM cte1)||'%';

Итак, используя в качестве теста следующее: -

DROP TABLE IF EXISTS mytable;
CREATE TABLE IF NOT EXISTS mytable (mytext TEXT);
INSERT INTO mytable VALUES
    ('Bounce'),
    ('Bounce Back'),
    ('About Me'),
    ('About You'),
    ('Something Else'), -- ADDED to prove not found result
    ('Thinking About You')
;

WITH cte1(search_item) AS (SELECT 'bou') -- <<<<<<<<<< search argument
SELECT 
    CASE
        WHEN mytext LIKE (select search_item FROM cte1)||'%'
            THEN mytext||' - begins with '||(select search_item FROM cte1)
        ELSE 
            mytext||' - includes '||(select search_item FROM cte1)
    END AS phrased,
    mytext
FROM mytable 
WHERE mytext LIKE '%'||(select search_item FROM cte1)||'%';

Результат: -

enter image description here

Тем не менее, следующее может быть больше того, что вы хотите (т.е. упорядочено в зависимости от того, начинаются ли найденные данные с аргумента поиска или нет): -

WITH 
    cte1(search_item) AS (
            SELECT 'bou' -- <<<<<<<<<< search argument
        ), 
    cte2(phrased,ordering,mytext) AS (
            SELECT 
                CASE
                    WHEN mytext LIKE (select search_item FROM cte1)||'%'
                        THEN mytext||' - begins with '||(select search_item FROM cte1)
                    ELSE 
                        mytext||' - includes '||(select search_item FROM cte1)
                END AS phrased,
                    CASE
                    WHEN mytext LIKE (select search_item FROM cte1)||'%'
                        THEN 0
                    ELSE 1
                END AS ordering,
                mytext
            FROM mytable 
            WHERE mytext LIKE '%'||(select search_item FROM cte1)||'%'
        )
    SELECT mytext, phrased FROM cte2 ORDER BY ordering;
;

Что приводит к: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...