[SQLServer] SQLServerでSplitを実装!
SQLServerでSplitを実装してみます。
最新のSQLServerには組み込み関数があるらしいですが、
わたしの使っているバージョンにはない!です。
元々、IPアドレスをSplitしたい案件があり、その過程で作成したものです。
http://stackoverflow.com/questions/10581772/how-to-split-a-comma-separated-value-to-columns
こちらを丸パクリしていますが、バグっていたので修正。(コメントアウトのところ)
※IPアドレス中に同じ”数値+Delimiter”が2つ含まれていると、Replaceで二つ変換されてバグる。
IPアドレス以外を扱うときは、Delimiterの'.'を別なのに差し替えてください。
CREATE FUNCTION [dbo].[SplitIP]
(
@multiwordstring VARCHAR(255),
@wordnumber NUMERIC
)
returns VARCHAR(255)
AS
BEGIN
DECLARE @remainingstring VARCHAR(255)
SET @remainingstring=@multiwordstring
DECLARE @numberofwords NUMERIC
SET @numberofwords=(LEN(@remainingstring) - LEN(REPLACE(@remainingstring, '.', '')) + 1)
DECLARE @word VARCHAR(50)
DECLARE @parsedwords TABLE
(
line NUMERIC IDENTITY(1, 1),
word VARCHAR(255)
)
WHILE @numberofwords > 1
BEGIN
SET @word=LEFT(@remainingstring, CHARINDEX('.', @remainingstring) - 1)
INSERT INTO @parsedwords(word)
SELECT @word
-- SET @remainingstring= REPLACE(@remainingstring, Concat(@word, '.'), '')
SET @remainingstring=substring(@remainingstring, CHARINDEX('.', @remainingstring)+1, len(@remainingstring))
SET @numberofwords=(LEN(@remainingstring) - LEN(REPLACE(@remainingstring, '.', '')) + 1)
IF @numberofwords = 1
BREAK
ELSE
CONTINUE
END
IF @numberofwords = 1
SELECT @word = @remainingstring
INSERT INTO @parsedwords(word)
SELECT @word
RETURN
(SELECT word
FROM @parsedwords
WHERE line = @wordnumber)
END;
GO
スポンサードリンク
関連記事
-
[PostgreSQL] csvでSQL結果を出力する方法(psqlコマンド)
SQLエディタ、接続ツールなどを使うと簡単に行える CSVファイルでの出力 について、コ
-
[PostgreSQL][SQL] csvファイルのインポート
PostgreSQLでcsvファイルをインポートする際の方法を解説します。 例題として、以下の
-
[PostgreSQL] よく使う基本コマンド
PostgreSQLでpsqlのコマンド入力をする場合の一般的SQL以外のコマンドを列挙します。
-
[SQLServer] 日付の加算・減算
SQLServerでの日付の加算・減算方法をまとめます。 現在時刻の取得方法 現在時刻は「GET
-
[RDB][SQL] JOINについて
JOINについて説明します。 まず、以下の2つのテーブルがあります。 簡単なテーブルなので、
-
[SQL] 副問い合わせのin句に指定できるワードの数について
副問い合わせのin句に指定できるワードの数について ●Oracle 1000個が上限のようで
-
[SQL][集計関数] 行数をカウントするcount関数の解説
count関数について説明します。 count関数は、グループ化した単位での件数をカウントしま
-
[SQL] primary keyの追加・削除
テーブル作成後にprimary keyを付与する方法です。 ALTER TABLE テーブ
-
[SQLServer] 当日0時や月初0時の取得方法
当日0時や月初0時の取得方法です。 当日0時 DATEADD関数の2番目の引数にDATEDI
-
[PostgreSQL][SQL] 日付関連
●interval tbl_Aから、tbl_Bの日付で7日前~現在に当てはまるレコードを抽出す
Comment
参考にさせていただきました
CREATE FUNCTION [dbo].[fncSplit](@prmCHAR AS VARCHAR(MAX),@prmSTR AS VARCHAR(MAX),@prmNUM AS SMALLINT)
RETURNS varchar(max)
AS
BEGIN
DECLARE @RTN AS VARCHAR(MAX)
DECLARE @P AS INT
SET @P = 1
DECLARE @CNT AS INT
SET @CNT = 1
WHILE @P <= LEN(@prmSTR)
BEGIN
IF CHARINDEX(@prmCHAR,@prmSTR,@P) 0
BEGIN
SELECT @RTN = SUBSTRING(@prmSTR,@P,CHARINDEX(@prmCHAR,@prmSTR,@P)-@P)
SET @P = @P + 1 + CHARINDEX(@prmCHAR,@prmSTR,@P)-@P
END
ELSE
BEGIN
SELECT @RTN = SUBSTRING(@prmSTR,@P,LEN(@prmSTR)-@P+1)
SET @P = @P + 1 + LEN(SUBSTRING(@prmSTR,@P,LEN(@prmSTR)-@P+1))
END
IF @CNT >= @prmNUM
BEGIN
BREAK
END
ELSE
BEGIN
SET @RTN = ''
CONTINUE
END
SET @CNT = @CNT + 1
END
RETURN @RTN
END
すみません訂正です。
CREATE FUNCTION [dbo].[fncSplit](@prmCHAR AS VARCHAR(MAX),@prmSTR AS VARCHAR(MAX),@prmNUM AS SMALLINT)
RETURNS varchar(max)
AS
BEGIN
DECLARE @RTN AS VARCHAR(MAX)
DECLARE @P AS INT
SET @P = 1
DECLARE @CNT AS INT
SET @CNT = 1
WHILE @P <= LEN(@prmSTR)
BEGIN
IF CHARINDEX(@prmCHAR,@prmSTR,@P) 0
BEGIN
SELECT @RTN = SUBSTRING(@prmSTR,@P,CHARINDEX(@prmCHAR,@prmSTR,@P)-@P)
SET @P = @P + 1 + CHARINDEX(@prmCHAR,@prmSTR,@P)-@P
END
ELSE
BEGIN
SELECT @RTN = SUBSTRING(@prmSTR,@P,LEN(@prmSTR)-@P+1)
SET @P = @P + 1 + LEN(SUBSTRING(@prmSTR,@P,LEN(@prmSTR)-@P+1))
END
IF @CNT >= @prmNUM
BEGIN
BREAK
END
ELSE
BEGIN
SET @RTN = ''
--CONTINUE
END
SET @CNT = @CNT + 1
END
RETURN @RTN
END