2016-05-02 4 views
1

をマージ:SQL分割と、これは私の問題である文字列

**0756FJ89045GJD38**.pdf 

今、私は、この文字列でパスを生成する必要があります:

/home/ars/07/56/FJ/89/04/5G/JD/38/0756FJ89045GJD38.pdf 
私はこのような列から文字列を得た

私は2つの文字を取って、左から右に1つのパスレベルまで構築する必要があります。

多分私は、ありがとう!

+0

は、固定された文字列の長さですか? –

+0

このリンクで必要な情報をすべて見つけることができると思います。https://msdn.microsoft.com/en-us/library/ms181984.aspx –

+0

変数がありません。 – JER

答えて

2

これが役立つことがあります。

DECLARE @p nvarchar(100) = '**0756FJ89045GJD38**.pdf', 
     @n int = 3 

;WITH cte AS (
SELECT STUFF(REPLACE(SUBSTRING(@p,1,CHARINDEX('.',@p)-1),'*',''),1,0,'/') as p, 1 [level] 
UNION ALL 
SELECT STUFF(p,[level][email protected],0,'/'), [level][email protected] 
FROM CTE 
WHERE LEN(STUFF(p,[level][email protected],0,'/')) >= [level][email protected] 
) 

SELECT TOP 1 @p = '/home/ars'+p +'/'+REPLACE(@p,'*','') 
FROM cte 
ORDER BY [level] DESC 

SELECT @p 

出力:

/home/ars/07/56/FJ/89/04/5G/JD/38/0756FJ89045GJD38.pdf 

EDIT:

をPDFファイル名とすべての名前を持つテーブルがある場合は、あなたよりも、同じ大きさですこのようにすることができます:

DECLARE @n int = 3 

;WITH pdf AS (
    SELECT * 
    FROM (VALUES 
    ('**0756FJ89045GJD38**.pdf'), 
    ('**1729DA8CD189700A**.pdf'), 
    ('**A6710936BCD47832**.pdf'), 
    ('**00A764D617B93978**.pdf') 
    ) as t(file_) 
) 
,cte AS (
SELECT file_, STUFF(REPLACE(SUBSTRING(file_,1,CHARINDEX('.',file_)-1),'*',''),1,0,'/') as p, 1 [level] 
FROM pdf 
UNION ALL 
SELECT file_, STUFF(p,[level][email protected],0,'/'), [level][email protected] 
FROM CTE 
WHERE LEN(STUFF(p,[level][email protected],0,'/')) >= [level][email protected] 
) 

SELECT TOP 1 WITH TIES '/home/ars'+p +'/' + REPLACE(c.file_,'**','') 
FROM cte c 
ORDER BY ROW_NUMBER() OVER (PARTITION BY file_ ORDER BY [level]) DESC 

出力:

/home/ars/00/A7/64/D6/17/B9/39/78/00A764D617B93978.pdf 
/home/ars/A6/71/09/36/BC/D4/78/32/A6710936BCD47832.pdf 
/home/ars/17/29/DA/8C/D1/89/70/0A/1729DA8CD189700A.pdf 
/home/ars/07/56/FJ/89/04/5G/JD/38/0756FJ89045GJD38.pdf 
+0

私は今日それを試してフィードバックを与えるだろう;) – JER