iOS: Цель C - запрос Sqlite, чтобы получить записи, которые имеют значения разделителя запятых в предложении where - PullRequest
0 голосов
/ 11 октября 2018

В моей базе данных есть записи, в которых есть столбец со значениями, разделенными запятыми, как показано ниже:

enter image description here

Я хочу те записи, которые имеют RoomNo = 121только.

Если я использую запрос

select ID,RoomNo from RoomTable WHERE RoomNo = 121

ИЛИ

select ID,RoomNo from RoomTable WHERE RoomNo LIKE '%121%'

Возвращается только одна запись:

enter image description here

Но я хочу строки № 8, 10, 11 на выходе.Я пробовал также с SET, regexp, но не повезло.

Пожалуйста, предложите.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 11 октября 2018

У меня нет проекта, настроенного на SQLite, но быстрый поиск показывает, что он поддерживает RegEx (регулярные выражения).

Вы можете попробовать:

select ID,RoomNo from RoomTable WHERE RoomNo REGEXP '(?<!\d)(121)(?!\d)'

Тоговорит: все записи, где RoomNo содержит 121 , а не , с предшествующим (негативный просмотр сзади) или сопровождаемым (негативный просмотр вперед) DIGIT, поэтому не соответствует 1121 или1210, но он будет совпадать 121, или , 121 или 121.

Вот тестер RegEx этого https://regex101.com/r/aS8jQ8/27

Редактировать: Как отметил "Шон", это не будет работать "из коробки".И я не знаю, может ли функция REGEXP быть предоставлена ​​в iOS.

0 голосов
/ 11 октября 2018

Как я уже упоминал в предыдущем комментарии, лучший способ сделать это с правильным дизайном базы данных - вместо строки, такой как (11, '12,121,20'), иметь три строки (11,12), (11,121) и (11,20), поэтомупростой WHERE roomno = 121 может быть использован.Хранить ваши данные таким образом, чтобы СУБД была рассчитана на работу, намного проще, чем то, что вы делаете, пытаясь заставить квадратный колышек в круглое отверстие.

Однако, если вы можете 'Почему-то исправить ваши данные ... Список чисел, разделенных запятыми, очень близок к массиву чисел JSON, а sqlite имеет приличную поддержку для работы с JSON ...

Итак, с учетом этой таблицы:

CREATE TABLE rooms(id INTEGER, roomno TEXT);
INSERT INTO rooms VALUES (9, '108'), (11, '12,121,205'), (12, '12,205')
                       , (16, '121'), (17, '121,205'), (20, '205');

этот запрос

SELECT *
FROM rooms AS r
WHERE 121 IN (SELECT j.value FROM json_each('[' || r.roomno || ']') AS j)
ORDER BY id

дает вам

id          roomno    
----------  ----------
11          12,121,205
16          121       
17          121,205  
0 голосов
/ 11 октября 2018

Это должно работать

выберите * из RoomTable, где RoomTable.roomID похож на '% 121%'

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

RoomTable

Query

...