2017-04-03 2 views
2

My select文は2つの列を返します。列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' 

下の現在のコードを以下のコメントには非常に明確ではありませんでした。私はあなただけ取りたいのであれば、私は、ColumnAについては次の\

+4

http://meta.stackoverflow.com/questions/271055/tips-for([良いSQLの質問をする方法]サンプルデータを提供してくださいとお読みください(271056)と[MCVEの作成方法](http://stackoverflow.com/help/mcve)を参照してください。ちょうどヒント: 'CHARINDEX'はあなたの友人です... – Shnugo

+0

charindex()は、文字の最初の位置を示し、left()またはsubstring()に入力します。 –

+0

文字列Pathは常に17文字より長いですか? – etsa

答えて

1

まで進む17個の文字を削除した

Even More Data 

を表示するには、以下の結果

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

から抽出しようとしています最初の17文字を使用する必要があります。

RIGHT(Path, LEN(Path) - 17) 

パスが35文字より長い場合は正しくk

最初のバックスラッシュ、使用までの文字列を返すためとして:これは言う

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

:1で

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 

またはすべて

  • pathから部分文字列を抽出します
  • キャラクター18で始まる
  • 文字列の長さは、文字18で始まるpathの最初のバックスラッシュの位置を見つけることによって計算されます(18番目の文字で検索を開始したので、 元の文字列のない開始)

更新:

あなたはそのパスを保証することはできません場合@etsaは正しく、指摘するように、少なくとも18文字の長さで、文字の18の後にバックスラッシュが含まれていますfor 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

私は(実際には質問者が要求していなかった - あなたの答えに投票しました...) "保護"を追加します。このようなものはどこのレンズ(パス)> 18と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 

RETURNS

+--------------------------------------------------------------+----------------------------+-----------------------------------+----------------------+ 
|        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

こんにちは、 これはありがとうが、結果の異なる長さのために、 \の数は異なります。左から右に向かって、私はいつも第3と第4の間のテキストが欲しいと思っています。 – Shabbaranks

+0

これは簡単ですが、元の投稿でこれを指定していません。あなたはそれがどのように機能するか見たいと思っていますか? – scsimon

関連する問題