SQL RegEx用于处理逗号分隔的ID

时间:2015-06-27 01:23:58

标签: mysql sql regex

我有一个字符串,表示允许哪些用户访问某些内容。例如,如果用户1,用户2和用户3可以访问它,则accessibility列将包含1,2,3。如果只有用户1可以访问它,那么它只会是1等等。

我知道我无法执行简单的CONTAINS条款,因为搜索1可能会为14,2,3返回true。如果双方都有逗号,或者两个都没有ID号,我怎样才能获得正则表达式?

以下是我尝试做的一个示例

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

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

我需要告诉正则表达式搜索一个数字,并确保它在字符串的开头和字符串的结尾如果它周围没有逗号,如果它只有它,则在字符串的开头在它之后的逗号,如果它前面只有一个逗号,则位于字符串的末尾,或者如果它在两边都是逗号,那么它很好,因为它在字符串的中间。

我知道我需要做什么,但不知道如何实现它。感谢。

2 个答案:

答案 0 :(得分:3)

首先,由于以下几个原因,您的数据结构非常糟糕:

  • 在SQL中存储列表的正确方法是使用表,而不是字符串。
  • 在SQL中存储整数的正确方法是整数,而不是字符串。
  • 应使用正确的外键关系定义ID,当id存储在字符串中时,您无法执行此操作。

有时,我们会遇到其他人糟糕的设计决定。也就是说,我们无法创建一个正确的联结表,只有一列可以访问DataId每个用户。

在这种情况下,您可以使用MySQL中的find_in_set()功能。这不需要正则表达式。你可以写:

where find_in_set($user, accessibility) > 0

答案 1 :(得分:0)

由于A-Z,0-9和下划线被视为字边界,您可以这样概括:

- 单词绑定DataID,例如1成为\ b1 \ b
选择' \ b' || DataID || ' \ B' AS DataID_Bound FROM USER
WHERE REGEX_LIKE(DataID_Bound,辅助功能)

这样,如果有逗号前导,尾随或者它是搜索主题的唯一占用者,那么这并不重要。但它肯定不能匹配14或21等。\ b1 \ b只匹配solo 1,\ b14 \ b只匹配整个单词14等。