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