2015-06-27 5 views
0

У меня есть строка, которая обозначает, какие пользователи имеют доступ к чему-либо. Например, если пользователь 1, пользователь 2 и пользователь 3 могут получить к нему доступ, столбец accessibility будет содержать 1,2,3. Если бы только пользователь 1 мог получить к нему доступ, это было бы только 1 и так далее.SQL RegEx для обработки разделенных запятыми идентификаторов

Я знаю, что не могу сделать простой пункт CONTAINS, потому что поиск 1 может возвращать true для 14,2,3. Как получить регулярное выражение для размещения, когда есть запятая с обеих сторон, с одной стороны, или ни одного идентификационного номера?

Вот пример того, что я пытаюсь сделать

DataID: 1 
Accessibility: "1,2,3,4,5" 
Data: "secret stuff" 

DataID: 2 
Accessibility: "5,6,7,8,9" 
Data: "more secret stuff" 

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

Я знаю, что мне нужно делать, но не знаю, как этого достичь. Благодарю.

ответ

3

Во-первых, у вас есть действительно плохой структуры данных по нескольким причинам:

  • Правильный способ для хранения списков в SQL использует таблицы, а не строк.
  • Правильный способ хранения целых чисел в SQL является целым числом, а не строками.
  • Идентификаторы должны определяться с помощью отношения внешнего ключа, которое невозможно выполнить, когда идентификатор хранится в строке.

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

В этой ситуации вы можете использовать функциональность find_in_set() в MySQL. Это не требует регулярного выражения. Вы можете просто написать:

where find_in_set($user, accessibility) > 0 
+0

Да, это вопрос манипулирования извлеченными данными, написанными кем-то другим , Я подумал о том, чтобы сделать cron-задание, чтобы разобрать все и сохранить его правильно, но если это простой подход, я бы предпочел просто получить доступ к нему на лету. Спасибо. – SISYN

0

Так как A-Z, 0-9 и подчеркивание считаются границы слов, можно обобщить следующим образом:

- слово переплете DataID, например, 1 становится \ b1 \ b
SELECT '\ b' || DataID || «\ Ь» КАК DataID_Bound ОТ ПОЛЬЗОВАТЕЛЯ
ГДЕ REGEX_LIKE (DataID_Bound, доступность)

Таким образом, это не имеет значения, если есть запятая ведущий, в конце, если это единственный обитатель поиска объекта. Но он не может совпадать с 14 или 21 и т. Д. \ B1 \ b будет соответствовать только соло 1, \ b14 \ b будет соответствовать только целому слову 14 и т. Д.

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