在SQL中选择具有某些“/”的项目

问题描述:

我对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-精简版数据库做

您可以使用这种伎俩来算一个字符出现在字符串:

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

您可以使用正则表达式:

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 

如果必须在第一和最后/后的东西,表达的改变为'^([^/]+)/([^/]+)/([^/]+)$'