2

Есть две таблицы. Основная и содержащая слова-исключения.

Первая основная (образно tab1)

Id | Title
1  | Яблоко красное
2  | Зеленое яблоко
3  | Спелый апельсин
4  | Желтый банан
5  | Киви зеленое

Вторая таблица tab2

Id | ExceptWord
1  | яблоко
2  | киви

Смысл запроса - вывести все записи столбца Title таблицы №1, кроме тех что совпадают частично со всем содержимым стоблца ExceptWord таблицы №2

Работает следующий запрос:

SELECT Title FROM tab1 WHERE Title NOT IN (SELECT ExceptWord FROM tab2)

Но он выводит только по точному совпадению всей фразы. Не могу додумать, когда прикрутить LIKE%%, чтобы в конечном итоге вернулись две записи "Спелый апельсин" и "Желтый банан".

3 Answers3

2

Как-то так:

SELECT *
  FROM t_1
 WHERE NOT EXISTS (
         SELECT *
           FROM t_2
          WHERE t_1.title LIKE ('%' || t_2.exceptword || '%')
       )
;

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

Ainar-G
  • 16,042
1

Думаю, примерно такой будет запрос sqlite:

SELECT Title FROM tab1
WHERE (SELECT count(*) FROM tab2 where lower(tab1.title) like '%' || lower(ExceptWord) || '%') = 0
gil9red
  • 77,085
0
letters = []
letters2 = []
count = 0
for item in tab1[:]:
   for item2 in tab2[:]:
       for letter in str (item.title()):
           for letter2 in str (item2.title()):
                count += 1
                letters.append (letter)
                letters2.append (letter2)
                if count == len (str (item)):
                     count = 0
                     if not (letters == letters2):
                          print (item)
                          print (item2)

Попробуйте так. Не знаю,что получится!

tohatsu
  • 1,157
  • 2
  • 9
  • 32
  • 1
    Вопрос не по питону ведь? Кст, а зачем str (item.title()), title() же и так строку вернет? Вместо if not (letters == letters2): проще на не проверить: if letters != letters2:. – gil9red May 14 '20 at 10:00
  • да... так себе у меня – tohatsu May 14 '20 at 10:00
  • Благодарю. Тоже мысль была циклом прогнать. И это будет работать нормально, если записей не много. А если несколько тысяч.. Вера в то, что можно все равно как-то выдернуть нужые данные одним запросом не покидает меня ) – Николай May 14 '20 at 10:01
  • да... оцените мой ответ пж – tohatsu May 14 '20 at 10:02
  • Для поиска подстроки можно использовать оператор in, а для исключения вхождения not in. Для приведения к общему регистру используйте lower или upper. Например: "яблоко" not in "Яблоко красное".lower(). Если использовать эту логику можно два цикла убрать из кода. И не нужно делать копии tab1 и tab2, вы ведь значения не меняете – gil9red May 14 '20 at 10:07
  • да. Это верно. А у меня... – tohatsu May 14 '20 at 10:09