我有一个字符串,表示允许哪些用户访问某些内容。例如,如果用户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"
我需要告诉正则表达式搜索一个数字,并确保它在字符串的开头和字符串的结尾如果它周围没有逗号,如果它只有它,则在字符串的开头在它之后的逗号,如果它前面只有一个逗号,则位于字符串的末尾,或者如果它在两边都是逗号,那么它很好,因为它在字符串的中间。
我知道我需要做什么,但不知道如何实现它。感谢。
答案 0 :(得分:3)
首先,由于以下几个原因,您的数据结构非常糟糕:
有时,我们会遇到其他人糟糕的设计决定。也就是说,我们无法创建一个正确的联结表,只有一列可以访问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等。