0

ディレクトリへの完全な UNC パスを含む一連のデータがあります。パスだけを選択したい (サーバー/IP を削除する)。これどうやってするの?

データ:

\\nas.home.example.com\dvd\My First Video
\\nas.office.example.com\business\Report1
\\nas.office.example.com\business\Report2
\\10.10.10.10\projects\proj1\images
\\10.10.10.10\projects\proj1\queries
\\10.10.10.10\projects\proj1\output

期待される結果 (先頭の の有無にかかわらず、\気にしません):

\dvd\My First Video
\business\Report1
\business\Report2
\projects\proj1\images
\projects\proj1\queries
\projects\proj1\output

私は次のことを試しました(上記の入力の1つに固有):

SELECT RIGHT(('\\nas.home.example.com\dvd\My First Video'), 
  CHARINDEX('\', REVERSE('\\nas.home.example.com\dvd\My First Video')));

これは、最も内側のディレクトリ ( My First Video) だけを返します。親を取得するためにオフセットを追加できますが、ディレクトリが正確にその文字数である場合にのみ機能します。

SELECT RIGHT(('\\nas.home.example.com\dvd\My First Video'), 
  CHARINDEX('\', REVERSE('\\nas.home.example.com\dvd\My First Video'))+4);

を返します\dvd\My First Video。これは良いことです - その 1 つの値に対して。すべてのデータ値に対して機能するようにクエリを変更するにはどうすればよいですか?

実際には、これらのクエリのうち 2 つが必要になるのではないかと思います。1 つは DNS 名を持つサーバー用で、すべてが で終わり、.comもう 1 つは IP アドレス用で、すべてが で始まります10.10

4

3 に答える 3

1

Aaron と同じ概念、わずかに異なる構文

SUBSTRING(p, CHARINDEX('\',p,3), 255)
于 2012-05-24T16:28:56.627 に答える
1
DECLARE @x TABLE (p VARCHAR(255))

INSERT @x SELECT '\\nas.home.example.com\dvd\My First Video'
UNION ALL SELECT '\\nas.office.example.com\business\Report1'
UNION ALL SELECT '\\nas.office.example.com\business\Report2'
UNION ALL SELECT '\\10.10.10.10\projects\proj1\images'
UNION ALL SELECT '\\10.10.10.10\projects\proj1\queries'
UNION ALL SELECT '\\10.10.10.10\projects\proj1\output'
UNION ALL SELECT 'foo.bar\whatever\who';

SELECT p, x = SUBSTRING(p, CHARINDEX('\', SUBSTRING(p, 3, 4000)) + 2, 4000) FROM @x;

結果:

p                                           x
-----------------------------------------   ------------------------
\\nas.home.example.com\dvd\My First Video   \dvd\My First Video
\\nas.office.example.com\business\Report1   \business\Report1
\\nas.office.example.com\business\Report2   \business\Report2
\\10.10.10.10\projects\proj1\images         \projects\proj1\images
\\10.10.10.10\projects\proj1\queries        \projects\proj1\queries
\\10.10.10.10\projects\proj1\output         \projects\proj1\output
foo.bar\whatever\who                        \whatever\who

先頭の を削除する場合は\、 に変更+ 2+ 3ます。

于 2012-05-24T16:23:09.717 に答える
0

これを試してください(重要な部分は3行目です):

DECLARE @str varchar(100)
SET @str = '\\nas.home.example.com\dvd\My First Video'
select substring(@str, CHARINDEX('\', @str, 3), len(@str) - charindex('\', @str, 3))

ステートメント@strの列名に置き換えます。SELECT

これは、3 番目の文字の後の '\' の最初のインデックスから始まる文字列の部分文字列を取得し、文字列の全長から 3 番目の文字の後の '\' の最初のインデックスを引いた長さを持ちます。

于 2012-05-24T16:27:59.420 に答える