Как выбрать все поля из одной таблицы, содержащие подстроку из любой строки в другом столбце - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь экспортировать словарь слов в sqlite, состоящий только из слов, которые начинаются с, содержат или заканчиваются определенными фильтрами.

Если один фильтр был 'ment' и его можно было найти где угоднов слове;это будет включать такие слова, как «момент», «упомянутый» и «реализованный».Если другой был «под» и мог быть только префиксом;это будет соответствовать таким словам, как «underachieve» и «undercharged», но не «грабить».

Я нашел несколько похожих вопросов вокруг - однако я не смог заставить их работать, или онипредназначены для полных версий SQL и содержат функции не в SQLite.В основном моя проблема в том, что это не просто «соответствует каждой подстроке» - здесь есть префиксы, суффиксы и фразы (в любом месте слова совпадают)

Уже опробовано:
* Выбор строк из таблицыкоторые содержат любое слово из длинного списка слов в другой таблице
* Поиск строки SQL Server для значений из другой таблицы
* SQL выбирает строки, где поле содержит слово изполя другой таблицы
* https://social.msdn.microsoft.com/Forums/sqlserver/en-US/b9bb1003-80f2-4e61-ad58-f6856666bf85/how-to-select-rows-that-contain-substrings-from-another-table?forum=transactsql

Моя база данных выглядит так:
dictionary_full

------------------
word
------------------
abacuses
abalone
afterthought
auctioneer
before
biologist
crafter
...
------------------

filters

------------------
name    | type_id
------------------
after   | 1
super   | 1
tion    | 2
ses     | 3
logist  | 3
...

type

------------------
name
------------------
prefix
phrase
suffix

Я могу выбрать все фразы из БД, используя этот запрос:

SELECT name FROM filters WHERE type_id = (SELECT ROWID FROM type WHERE name='phrase');

, однако я не смог успешно работать в решениях, которые янайденный.Он либо не даст результатов, либо дублирует результаты.

например
Дубликаты:

SELECT d.word FROM dictionary_full d
JOIN filters f ON instr(d.word, (
SELECT name FROM filters WHERE type_id = (SELECT ROWID FROM type WHERE name='phrase')
)) > 0

Ожидаемые результаты:
Сочетание всех слов, которые:
- начинать с префиксов 'after' / 'super'
- ИЛИ где-либо содержать фразу'tion '
- ИЛИ заканчивать суффиксом' ses '/' logist '

------------------
word
------------------
abacuses
afterthought
auctioneer
biologist

1 Ответ

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

Звучит так, как вы хотите LIKE.

После создания некоторых примеров данных (для краткости и ясности пропускаем имена типов фильтров для преобразования в целые числа):

CREATE TABLE words(word TEXT PRIMARY KEY) WITHOUT ROWID;
INSERT INTO words(word) VALUES ('abacuses'), ('abalone'), ('afterthought'),
  ('auctioneer'), ('before'), ('biologist'), ('crafter');
CREATE TABLE filters(name TEXT, type TEXT, PRIMARY KEY(name, type)) WITHOUT ROWID;
INSERT INTO filters(name, type) VALUES ('after', 'prefix'), ('super', 'prefix'),
  ('tion', 'phrase'), ('ses', 'suffix'), ('logist', 'suffix');

Этот запрос

SELECT *
FROM words AS w
JOIN filters AS f ON (CASE f.type
                      WHEN 'prefix' THEN w.word LIKE f.name || '%'
                      WHEN 'suffix' THEN w.word LIKE '%' || f.name
                      WHEN 'phrase' THEN w.word LIKE '%' || f.name || '%'
                      END)
GROUP BY w.word -- eliminate duplicate matches
ORDER BY w.word;

приводит к

word          name        type      
------------  ----------  ----------
abacuses      ses         suffix    
afterthought  after       prefix    
auctioneer    tion        phrase    
biologist     logist      suffix
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...