0

私は以下のようなテーブルを持っています

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB'

以下のように出力する必要がありますが、UDFは使用しません。

Data  String
------------
SQL   S,Q,L
JOB   J,O,B

これで私を助けてください

4

4 に答える 4

2

できますよ :)。短くすることもできます...

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB';    

With cte as
(
    Select Data, Len(Data) DataLength, 1 level
    From @t
    Union All 
    Select Data, DataLength - 1, level + 1
    From cte
    Where DataLength > 1 
),
cte2 as
(
    Select Data, SUBSTRING(Data, DataLength, 1) DataLetter, level
    From cte
),
cte3 as
(
    Select Data, 
        (
            SELECT DataLetter + ','
            FROM cte2 c
            Where c.Data = cte2.Data
            Order By level desc
            FOR XML PATH(''), TYPE

        ).value('.[1]', 'NVARCHAR(1000)') DataComa
    From cte2
    Group By Data
)
Select Data, substring(DataComa, 1, Len(DataComa) - 1) Data2
From cte3
于 2012-07-17T12:26:25.180 に答える
1

パーティーに遅れましたが、少し短いバージョンを次に示します。

DECLARE @T TABLE(Data VARCHAR(MAX));

INSERT INTO @T VALUES('SQL'),('JOB'),('FLOOB');

;WITH n AS (SELECT TOP (SELECT MAX(LEN(Data)) FROM @T) 
  n = ROW_NUMBER() OVER (ORDER BY [object_id]) FROM sys.all_objects
),
t AS (SELECT n, Data, Letter = SUBSTRING(t.Data, n.n, 1) FROM n
  INNER JOIN @T AS t ON SUBSTRING(t.Data, n.n, 1) > ''
)
SELECT Data, STUFF((SELECT ',' + letter FROM t AS t2
  WHERE t2.Data = t.Data ORDER BY t2.n FOR XML PATH(''), 
  TYPE).value(N'./text()[1]', N'varchar(max)'), 1, 1, '')
FROM t GROUP BY Data;

結果:

FLOOB   F,L,O,O,B
JOB     J,O,B
SQL     S,Q,L
于 2012-07-17T13:00:41.687 に答える
0

UDFを使用するのは非常に簡単です。しかし、UDFを使用しない場合、私が考えることができる唯一の方法は

このようなもの

DECLARE @T TABLE(Data VARCHAR(MAX))
INSERT INTO @T
SELECT 'SQL' UNION ALL SELECT 'JOB'

select replace(replace(replace(data,'S','S,'),'Q','Q,'),'L','L,') from @T

ここでは、26文字すべてを置換機能で置き換える必要があります。つまり、「A」と「A」、「B」と「B」、「....」「Z」と「Z」、

于 2012-07-17T12:28:07.000 に答える
0

ここで Initcap 関数に使用したのと同じアプローチを使用しますhttp://beyondrelational.com/modules/2/blogs/70/posts/10901/tsql-initcap-function-convert-a-string-to-proper-case.aspx

DECLARE @T TABLE(Data VARCHAR(MAX)) 
INSERT INTO @T 
SELECT 'SQL' UNION ALL SELECT 'JOB' 

select data,
        upper(replace(replace(replace(replace(replace(replace(replace(
        replace(replace(replace(replace(replace(replace(replace(
        replace(replace(replace(replace(replace(replace(replace(
        replace(replace(replace(replace(replace(
            ' '+data ,
        ' a','a,'),' b','b,'),'c','c,'),'d','d,'),'e','e,'),'f','f,'),
        ' g','g,'),' h','h,'),'i','i,'),'j','j,'),'k','k,'),'l','l,'),
        ' m','m,'),' n','n,'),'o','o,'),'p','p,'),'q','q,'),'r','r,'),
        ' s','s,'),' t','t,'),'u','u,'),'v','v,'),'w','w,'),'x','x,'),
        ' y','y,'),' z','z,')) as splitted_data
from
    @t
于 2012-07-17T12:47:21.010 に答える