2017-04-03 29 views
2

我的select语句返回两列column A是基于列B但我删除了最初的17个字符。然后我想要做的就是将列A中的所有字符向上,直到遇到\(反斜杠)。谁能帮我实现这个请 - 以下左选择直到某个字符SQL

SELECT distinct substring(Path,17,18) AS Detail, Path 
FROM [DB].[dbo].[Projects] 
Where [Path] like '\DATA%' 
AND [Deleted] = '0' 

当前的代码只是再次重申我的例子不是在下面的评论很清楚。我想从以下结果中提取

\DATA\More Data\Even More Data\Data 1 

要显示

Even More Data 

因此,我已删除了程序17个字符,直到下一个\

+4

请提供样本数据和请参阅[如何问一个良好的SQL问题(http://meta.stackoverflow.com/questions/271055/tips-for -asking-a-good-structured-query-language-sql-question/271056)和[如何创建一个MCVE](http://stackoverflow.com/help/mcve)。只是一个提示:'CHARINDEX'是你的朋友...... – Shnugo

+0

charindex()会告诉你一个字符的第一个位置,并将它提供给left()或substring()。 –

+0

字符串Path是否总是比17 char更长? – etsa

回答

1

对于ColumnA,如果只想拿出前17个字符,你应该使用

RIGHT(Path, LEN(Path) - 17) 

由于你目前的解决方案不会工作如果Path超过35个字符,则k正确。

至于向上返回字符串的第一个反斜杠,使用:

SELECT LEFT(Detail, CHARINDEX('\', Detail)) FirstFolder, Detail, Path 
FROM 
(
    SELECT distinct RIGHT(Path, LEN(Path) - 17) AS Detail, Path 
    FROM [DB].[dbo].[Projects] 
    Where [Path] like '\DATA%' 
    AND [Deleted] = '0' 
) a 

或全部之一:

SELECT DISTINCT SUBSTRING(Path, 18, CHARINDEX('\', Path, 18) - 18) 
FROM [DB].[dbo].[Projects] 
WHERE [Path] like '\DATA%' 
AND [Deleted] = '0' 

这是说:

  • path抽取子
  • 起始于字符18
  • 字符串的长度将通过查找path中的第一个反斜杠的位置来计算,该位置从字符18开始,减去18(因为我们开始搜索第18个字符,并且我们希望它相对于我们搜索的开始原始字符串的开始)

更新:

由于@etsa正确地指出,如果不能保证这条道路是至少18个字符长,包含字符18后反斜杠用于ev的ERY行,你应该使用下列只返回那些满足这一条件的行:

SELECT DISTINCT SUBSTRING(Path, 18, CHARINDEX('\', Path, 18) - 18) 
FROM [DB].[dbo].[Projects] 
WHERE [Path] like '\DATA%' 
AND [Deleted] = '0' 
AND CHARINDEX('\', Path, 18) > 0 
+0

我会加上(其实它并不是要求提问者 - 我投你的答案......)“保护”;像这样'WHERE LEN(PATH)> 18 AND CHARINDEX('\',PATH,17)> 18' – etsa

0

不管你的数据的长度,这得到这似乎是你想要的父文件夹。

DECLARE @table TABLE ([Path] VARCHAR(256)) 
INSERT INTO @table VALUES 
('\DATA\More Data\Even More Data\Data 1'), 
('\\server\top folder\middle folder\bottom folder\file 1'), 
('x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\this is what we want\x') 

SELECT 
    [Path] 
    ,CHARINDEX('\',REVERSE([Path])) as [Reverse Position of last \] 
    ,CHARINDEX('\',REVERSE([Path]),CHARINDEX('\',REVERSE([Path])) + 1) as [Reverse Postion of next to last \] 
    ,REVERSE(
       SUBSTRING(
        REVERSE([Path]), 
        CHARINDEX('\',REVERSE([Path]))+1, 
        CHARINDEX('\',REVERSE([Path]),CHARINDEX('\',reverse([Path]))+1)-CHARINDEX('\',REVERSE([Path])) - 1)) as [Your Desired Results] 
FROM 
    @table 

退货

+--------------------------------------------------------------+----------------------------+-----------------------------------+----------------------+ 
|        Path        | Reverse Position of last \ | Reverse Postion of next to last \ | Your Desired Results | 
+--------------------------------------------------------------+----------------------------+-----------------------------------+----------------------+ 
| \DATA\More Data\Even More Data\Data 1      |       7 |        22 | Even More Data  | 
| \\server\top folder\middle folder\bottom folder\file 1  |       7 |        21 | bottom folder  | 
| x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\x\this is what we want\x |       2 |        23 | this is what we want | 
+--------------------------------------------------------------+----------------------------+-----------------------------------+----------------------+ 
+0

嗨, 感谢这一点,但由于潜在的不同长度的结果,从右到左不会工作\的数量会有所不同。从左到右,我总是希望第三个和第四个之间的文本 - 希望Im有意义? – Shabbaranks

+0

这很容易完成,但您没有在原始文章中指定此内容。你还想看看这是如何工作的吗? – scsimon