2017-02-10 1 views
0

Как получить элемент массива строк, который я разместил в столбце SQLite3?SQLite: размещение массива строк в столбце TEXT и обработка строки с помощью элемента массива

У меня есть этот SQLite3 таблица: Id INTEGER PRIMARY KEY, pseudos TEXT ведьма содержит идентификатор пользователя и список pseudos он использует:

0|Bob, Avee 
1|Test, Alice, Frank 
2|Boby, Robert 
3|Avebee, Bob 

Как получить все строки, которые имеют peudo " Боб ", а не" Боби "? При попытке LIKE «% Bob%» я, очевидно, согласен с «Boby», которую хочу избежать.

примечание: колонка «псевдо» может содержать неограниченное количество символов, разделенных символом «,». Сепаратор можно изменить.
В pseudos нет пробелов

+0

Какую версию SQL Server вы используете? – oryol

+0

Я использую SQLite3, но я хотел бы знать, есть ли решение, которое будет работать на всех SQL –

+1

@oryol, кто сказал, что это SQL Server? – jarlh

ответ

1

Итак, проблема здесь является дизайн без 1NF и как сделать это database- независимый. Я мог бы представить себе решение этого вопроса на SQLite или PostgreSQL, но придумать хорошее, перфорированное решение на обоих вряд ли будет просто или стоит времени.

В SQLite я бы посмотрел расширения FT3 и FT4 для индексов, которые могли бы эффективно поддерживать инфикс в подобных предложениях. Вы можете использовать индексы триграмм в PostgreSQL для достижения чего-то подобного, но с гораздо более дополнительной проверкой, поэтому не может быть адекватного ответа.

В PostgreSQL я бы сохранил массив терминов и использовал индексы GIN для решения этой проблемы, но это не всегда поддерживается SQLite.

Итак, ваш лучший вариант нейтральности базы данных - это нормализация и сохранение псевдоопределений в другой таблице. Тогда это просто соединение. В противном случае вам придется создавать другое решение для каждой базы данных, которую вы хотите поддерживать.

1

Гораздо лучше создать отдельную таблицу с UserId и Pseudo (по одной строке) и присоединиться к ней для поиска.

+0

Я не могу редактировать таблицу, чтобы решение не было жизнеспособным. –

1

В случае Oracle DB и SQLite, использовать SUBSTR и прямой инстр в

как

SELECT * FROM TEST WHERE UPPER(SUBSTR(pseudos, INSTR(pseudos, ' ')+1)) LIKE UPPER('%Bob%');

+0

выберите * из теста, где pseudos = SUBSTR (псевдо, INSTR (псевдо, '') +1) LIKE '% Bob%'; ничего не дает, не правильно ли я использую ваше решение? (попробовал «% BOB%», «% Bob%» и «% bob%» без каких-либо результатов, попробовал просто «%» и получил все) –

+0

Для решения проблемы прописных и строчных букв используйте UPPER. SELECT * FROM TEST WHERE UPPER (SUBSTR (pseudos, INSTR (псевдо, '') +1)) LIKE UPPER ('% Bob%'); – Pr3ds

+0

он работает немного больше, но только махирует «Aveebee, Bob», а не «Bob, Avee» –

Смежные вопросы