5

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

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

WHERE Path LIKE @FilePath + '%'

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

无论如何,回到我的问题。我希望能够修改查询,使其仅返回指定路径的直接子文件夹。这并不像在字符串末尾放一个斜杠那么简单,因为显然 % 通配符在解析字符串的正确部分时会吞噬所有内容。

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

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

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

4

2 回答 2

3

这是一种无需 LIKE 的方法:

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

(语句的第一部分与“Path like @FilePath + '%'”相同)。

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

如果你喜欢 LIKE,你可以这样写:

where Path like @FilePath + '%' and
      Path not like @FilePath + '%[\]%'
于 2012-07-10T13:24:16.003 回答
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
于 2012-07-10T13:46:50.813 回答