2015-06-27 61 views
0

我有一个字符串,表示哪些用户被允许访问某些东西。例如,如果用户1,用户2和用户3可以访问它,则accessibility列将包含1,2,3。如果只有用户1可以访问它,它只会是1等等。SQL RegEx处理逗号分隔的ID

我知道我不能做一个简单的CONTAINS子句,因为搜索1可能会返回true为14,2,3。当双方都有逗号,一方或双方都没有ID号码时,我如何得到一个正则表达式?

这里是我想要做的

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中存储整数的正确方法是整数,而不是字符串。
  • 应使用正确的外键关系来定义Ids,在将id存储在字符串中时不能执行此操作。

有时候,我们被其他人的糟糕的设计决定所困住。也就是说,我们无法创建适当的联结表,其中DataId各有一列,每个用户有权访问它。

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

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

是的,这是一个操纵其他人编写的检索数据的问题。我想过要做一个cron-job来解析所有的东西并妥善保存它,但如果它是一个简单的解决方法,我宁愿只是即时访问它。谢谢。 – SISYN

0

由于A-Z,0-9和下划线被认为是字边界,你可以概括如下:

- 字绑定数据ID,例如1变成\ b1 \ b
SELECT'\ b'|| DataID || “\ B” AS DataID_Bound FROM USER
WHERE REGEX_LIKE(DataID_Bound,无障碍)

这样,如果有领导,尾随一个逗号,或者如果它是搜索对象的唯一乘客也没关系。但它绝对不能匹配14或21等。\ b1 \ b将只匹配独奏1,\ b14 \ b将只匹配整个单词14等。