使用SQL Server“LIKE”函数从文件路径表中查找文件路径的子文件夹

时间:2012-07-10 12:51:56

标签: sql sql-server

我的SQL Server数据库表中的一列包含路径(不是文件路径,只是目录路径)。

我目前有一个查询,它使用LIKE函数返回给定文件路径的所有子文件夹;

WHERE Path LIKE @FilePath + '%'

另一方面,我知道这种方法存在问题,因为LIKE使用的转义字符都是有效的文件路径字符。我将在完成的查询中正确使用ESCAPE。

无论如何,回到我的问题。我希望能够修改查询,以便它只返回指定路径的直接子文件夹。这并不像在字符串末尾加上斜杠那么容易,因为很明显%wildcard会解析所有内容,因为它会解析字符串的右边部分。

我正在考虑使用[^]转义序列,或许做一个排除\字符的搜索,但我没有运气。我试过了;

WHERE Path LIKE @FilePath + '[^\]'

但它没有产生预期的结果,所以我甚至不确定我是否正确使用它。

2 个答案:

答案 0 :(得分:3)

这是一种不用LIKE的方法:

WHERE left(Path, len(@FilePath)) = @FilePath and
      charindex('\', substr(Path, len(@FilePath)+2, 1000)) = 0

(声明的第一部分与“像@FilePath +'%'的路径”相同。)

第二部分只是查看字符串并检查@FilePath后面没有反斜杠(可能是下一个字符是反斜杠)。

如果您喜欢LIKE,可以将其写为:

where Path like @FilePath + '%' and
      Path not like @FilePath + '%[\]%'

答案 1 :(得分:2)

请勿使用LIKE。 LEFT和SUBSTRING将提供更好的性能,因为您没有进行任何通配符搜索,您应该在所有情况下尝试避免。

下面的查询将执行此操作并排除完全匹配,因此如果存在目录'C:\ Temp \,它将不会显示在结果中,但所有子目录都将显示。

我们正在做的是丢弃可能包含更多子目录('\')的所有结果,只使用具有单个子目录的结果。

希望这有帮助!

DECLARE @directory VARCHAR(150);
SET @directory = 'C:\Temp\';

SELECT 
    * 
FROM 
    tblDir
WHERE 
    LEFT(Dir, LEN(@directory)) = @directory
    AND CHARINDEX('\', SUBSTRING(Dir, LEN(@directory) ,LEN(Dir) - LEN(@directory)), 2) = 0
    AND Dir <> @directory