2012-01-10 65 views
0

我對SQL轉義字符和count語句做了一些研究,但沒有找到解決我的問題的方法。雖然我用的東西,如:在SQL中選擇具有某些「/」的項目

SELECT * FROM table WHERE path LIKE '%/_%' ESCAPE '/'; 

我有一個表,其中一列有路徑,所以我想選擇在那裏我有一定數量的斜線的項目:

ID DIRECTORY 
1  root/A 
2  root/B 
3  root/A/1/2 
4  root/B/1/2 
5  root/A/1 
6  root/B/2 

那麼,如何我是否選擇只有2個斜槓的元素?

編輯1:這是Android的SQL-精簡版數據庫做

回答

1

您可以使用這種伎倆來算一個字符出現在字符串:

SELECT LENGTH('path') - LENGTH(REPLACE('path', '/', '')) AS `occurrences` 

這樣你就可以實現與

目標
SELECT id, path FROM 
    (SELECT id, path, LENGTH('path') - LENGTH(REPLACE('path', '/', '')) AS `occurrences` 
    FROM table) temp 
WHERE occurrences = 2 

不過,我希望表現將是可怕的。如果你要查詢那樣,考慮與路徑深度添加一列,這樣就可以與

SELECT id, path FROM table WHERE depth = 2 
+0

'CHAR_LENGTH直接查詢()'可能一般比'長度()'更可取:前者總是對字符進行計數,而後者則對字節進行計數,這並不總是對應於字符計數。 – 2012-01-10 01:35:23

+0

肯定發生的想法似乎是關鍵,只需要弄清楚如何做查詢。 – Raykud 2012-01-11 00:14:26

2

您可以使用正則表達式:

SELECT * FROM table WHERE path REGEXP '^([^/]*)/([^/]+)/([^/]*)$'; 

上述表達式專門查找字符的可選組不含/,隨後/,接着另一組沒有/,隨後/和字符串的結束之前任選另一組字符。

所以:

 /Bxx92/2 -- match 
5  root/A/1 -- match 
6  root/Bxx92/2 -- match 
6  root/Bxx92/2 -- match 
7  root/Bxx92/ -- match 
6  root/2 -- NO match 

如果必須在第一和最後/後的東西,表達的改變爲'^([^/]+)/([^/]+)/([^/]+)$'

相關問題