我的SQL Server数据库表中的一列包含路径(不是文件路径,只是目录路径)。
我目前有一个查询,它使用LIKE
函数返回给定文件路径的所有子文件夹;
WHERE Path LIKE @FilePath + '%'
另一方面,我知道这种方法存在问题,因为LIKE使用的转义字符都是有效的文件路径字符。我将在完成的查询中正确使用ESCAPE。
无论如何,回到我的问题。我希望能够修改查询,以便它只返回指定路径的直接子文件夹。这并不像在字符串末尾加上斜杠那么容易,因为很明显%wildcard会解析所有内容,因为它会解析字符串的右边部分。
我正在考虑使用[^]转义序列,或许做一个排除\字符的搜索,但我没有运气。我试过了;
WHERE Path LIKE @FilePath + '[^\]'
但它没有产生预期的结果,所以我甚至不确定我是否正确使用它。
答案 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