MS SQL REPLACE基于$左侧的1个字符

时间:2015-05-18 12:29:15

标签: sql-server sql-server-2008 replace

我不是SQL专家所以请原谅我,如果这是SQL 101 :)。

在select语句中有2个替换函数。他们寻找一个Servername,它的管理员分享d $由它的UNC路径。示例'\ SERVERNAME \ d $' 然后用'D:'替换'\ SERVERNAME \ d $'。

以下是目前的查询:

select Replace(p.Path,'\\SERVERNAME\d$','D:') as searchpath
                 ,p.path as fullpath 
                 ,s.ShareName
                 ,s.SharePath
                 ,p.Member
                 ,p.Access         
   From   Paths As p
                 Left Outer Join Shares as s on
                              Replace(p.Path,'\\SERVERNAME\d$','D:') Like s.SharePath + '\%'

到目前为止,它一直是d $。 今天我的需求已经改变,我需要查询找到任何服务器名称UNC路径管理员共享,无论共享字母(c $,d $,e $,f $ ...等),并将其替换为相应的驱动器号(D: ,E:,F:......等)。

我的想法是替换功能可以找到$并在其左侧看一个字符以获得正确的共享字母,然后将其用于替换。我不是SQL专业人员的问题是,我知道SQL可以做我需要它做的事情......我只是不知道如何到达那里。我用Google搜索并找到了一些例子,但是没有任何运气让他们工作。 任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:1)

您可以结合使用STUFFPATINDEXLEN来获得所需内容。

示例查询

DECLARE @ReplaceChar VARCHAR(100) = '[prefixcharacters]\\SERVERNAME\d$[postcharacter]'
DECLARE @SearchString VARCHAR(100) = '\\SERVERNAME\_$'


SELECT 
STUFF(@ReplaceChar,PATINDEX('%' + @SearchString + '%',@ReplaceChar),LEN(@SearchString),
UPPER(SUBSTRING(@ReplaceChar,PATINDEX('%' + @SearchString + '%',@ReplaceChar) + LEN(@SearchString) - 2,1)) + ':') as searchpath
WHERE PATINDEX('%' + @SearchString + '%',@ReplaceChar) > 0

<强>输出

[prefixcharacters]D:[postcharacter]

替代查询

如果您希望根据标题获取$之前的前一个字符,则可以缩短查询。像这样的东西

DECLARE @ReplaceChar VARCHAR(100) = '[prefixcharacters]\\SERVERNAME\d$[postcharacter]'
DECLARE @SearchString VARCHAR(100) = '\\SERVERNAME\_$'

SELECT
STUFF(@ReplaceChar,
    PATINDEX('%'+@SearchString+'%',@ReplaceChar),
    LEN(@SearchString),
    UPPER(SUBSTRING(@ReplaceChar,CHARINDEX('$',@ReplaceChar) -1,1)) + ':')
WHERE PATINDEX('%'+@SearchString+'%',@ReplaceChar) > 0

在此查询中

  1. STUFF将您的模式替换为$ + ':'之前的字符
  2. 模式的开始由PATINDEX('%'+@SearchString+'%',@ReplaceChar)
  3. 标识
  4. D通过获取{$ 1}的charindex然后使用SUBSTRING
  5. 获取前一个字符来识别

答案 1 :(得分:0)

DECLARE @str nvarchar (100)
SET @str = '\\SERVERNAME\d$'
IF @str LIKE '\\SERVERNAME\_$'
    SET @str = UPPER(SUBSTRING(@str, 14, 1)) + ':'
SELECT @str

从上一个开始,比如

select UPPER(SUBSTRING(p.path, 14, 1)) + ':' as searchpath
                 ,p.path as fullpath 
                 ,s.ShareName
                 ,s.SharePath
                 ,p.Member
                 ,p.Access         
   From   Paths As p
                 Left Outer Join Shares as s on
                              SUBSTRING(p.path, 14, 1) + ':' Like s.SharePath + '\%'

答案 2 :(得分:0)

¸

怎么样?
select Replace(SUBSTRING(p.path, 14, Len(@spath)-14),'$',':') as searchpath
             ,p.path as fullpath 
             ,s.ShareName
             ,s.SharePath
             ,p.Member
             ,p.Access         
From   Paths As p
             Left Outer Join Shares as s on
                         Replace(SUBSTRING(p.path, 14, Len(@spath)-14),'$',':') Like s.SharePath + '\%

选择搜索路径

答案 3 :(得分:0)

我也不是mysql专家:)

根据你在问题的最后部分提到的逻辑,我使用了concat和substring来获取列中的驱动器号。

希望这有帮助

select replace(path, concat(substring(path, 1, locate('$', path) - 2),  substring(path, locate('$', path) - 1, 1) , '$'), concat(substring(path, locate('$', path) - 1, 1) , ':')) as searchpath ...

查询的其余部分将是相同的。