2017-04-03 81 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

相關問題