transactionID
この形式のデータを含む列があります: 3368/00392224/000/00
.
この列から次のような 4 つの列にデータを抽出する必要があります。
Column name Data
A 3368
B 00392224
C 000
D 00
効率よく値を抽出するには、SQL Server 文字列関数を使用してこれを達成する必要があります。誰でも私を助けることができますか?
transactionID
この形式のデータを含む列があります: 3368/00392224/000/00
.
この列から次のような 4 つの列にデータを抽出する必要があります。
Column name Data
A 3368
B 00392224
C 000
D 00
効率よく値を抽出するには、SQL Server 文字列関数を使用してこれを達成する必要があります。誰でも私を助けることができますか?
SQL Server を使用していると仮定すると、SUBSTRING ( http://msdn.microsoft.com/en-us/library/ms187748.aspx ) と CHARINDEX ( http://msdn.microsoft.com/en- us/library/ms186323.aspx ) これを実現するには:
SELECT
CHARINDEX('/',MyColumn) AS P1,
CHARINDEX('/',MyColumn,CHARINDEX('/',MyColumn)+1) AS P2,
CHARINDEX('/',MyColumn,CHARINDEX('/',MyColumn,CHARINDEX('/',MyColumn)+1)+1) AS P3
FROM MyTable;
/
これにより、3 人のキャラクターの位置がわかります。フィールドを分割するには、これを使用します。
SELECT
SUBSTRING(transactionId,1,P1-1) AS A,
SUBSTRING(transactionId,P1+1,P2-P1-1) AS B,
SUBSTRING(transactionId,P2+1,P3-P2-1) AS C,
SUBSTRING(transactionId,P3+1,LEN(transactionId)) AS D
FROM(
SELECT
CHARINDEX('/',transactionId) AS P1,
CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1) AS P2,
CHARINDEX('/',transactionId,CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1)+1) AS P3,
transactionId
FROM dbo.MyTable
)X;
最後に、バージョン 2005 以降を使用している場合は、UNPIVOT ( http://msdn.microsoft.com/en-us/library/ms177410(v=sql.105).aspx ) を使用して、値を複数の行に分割できます。 :
SELECT U.*
FROM (
SELECT
SUBSTRING(transactionId,1,P1-1) AS A,
SUBSTRING(transactionId,P1+1,P2-P1-1) AS B,
SUBSTRING(transactionId,P2+1,P3-P2-1) AS C,
SUBSTRING(transactionId,P3+1,LEN(transactionId)) AS D
FROM(
SELECT
CHARINDEX('/',transactionId) AS P1,
CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1) AS P2,
CHARINDEX('/',transactionId,CHARINDEX('/',transactionId,CHARINDEX('/',transactionId)+1)+1) AS P3,
transactionId
FROM dbo.MyTable
)X
)Y
UNPIVOT (Data for ColumnName IN(A,B,C,D))U ;
ここにSQLフィドルがあります
さて、パフォーマンスはまったく別のトピックです。SQL Server は本質的に文字列操作が苦手です。CLR文字列分割関数を使用すると、これを大幅に高速化できます。
SQL サーバーの場合
常に正確に 4 つの値があると仮定すると、卑劣なトリックを使用できます。PARSENAME
その制限に問題がなければ、面倒な解析方法よりもはるかに扱いにくくなります。
DECLARE @x TABLE(ID INT, transactionId VARCHAR(255));
INSERT @x VALUES(1, '000/334/1123232/3434');
INSERT @x VALUES(2, '343/224/114/32325665454');
;WITH x(ID, A,B,C,D) AS
(
SELECT ID, PARSENAME(t,4), PARSENAME(t,3), PARSENAME(t,2), PARSENAME(t,1)
FROM (SELECT ID, t = REPLACE(transactionId,'/','.') FROM @x) AS y
)
SELECT ID, [Column name], [Data] FROM x
UNPIVOT ([Data] FOR [Column name] IN (A,B,C,D)) AS up;
結果:
ID Column name Data
-- ----------- ------------
1 A 000
1 B 334
1 C 1123232
1 D 3434
2 A 343
2 B 224
2 C 114
2 D 32325665454
以下のコードを使用して、欲望の結果を取得します
DECLARE @String varchar(max)、@Splitchar char(1)、@Xmlvalue xml
set @String = '3368/00392224/000/00' set @Splitchar = '/'
SELECT @Xmlvalue = CONVERT(xml,' <root> <s> ' + REPLACE(@String,@Splitchar,'</s> <s>') + ' </s> </root> ')
SELECT [値] = Tcvalue('.','varchar(20)') FROM @Xmlvalue.nodes('/root/s') T(c)