2015-06-27 60 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等。