[SQLServer] SQLServerでSplitを実装!

公開日: : DB, SQL

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

スポンサードリンク

関連記事

no image

[PostgreSQL] csvでSQL結果を出力する方法(psqlコマンド)

SQLエディタ、接続ツールなどを使うと簡単に行える CSVファイルでの出力 について、コ

記事を読む

no image

[SQL] 割合を計算するときの定石(割られる数をCASTする)

なんとか率などの割合を計算するときのメモ。 割られるほうの数値を浮動小数点にCASTする 割られ

記事を読む

no image

[PostgreSQL][SQL] 日付関連

●interval tbl_Aから、tbl_Bの日付で7日前~現在に当てはまるレコードを抽出す

記事を読む

no image

[SQL] primary keyの追加・削除

テーブル作成後にprimary keyを付与する方法です。 ALTER TABLE テーブ

記事を読む

no image

[SQL] 副問い合わせのin句に指定できるワードの数について

副問い合わせのin句に指定できるワードの数について ●Oracle 1000個が上限のようで

記事を読む

no image

[PostgreSQL] よく使う基本コマンド

PostgreSQLでpsqlのコマンド入力をする場合の一般的SQL以外のコマンドを列挙します。

記事を読む

no image

[SQLServer] 日付の加算・減算

SQLServerでの日付の加算・減算方法をまとめます。 現在時刻の取得方法 現在時刻は「GET

記事を読む

no image

[SQL] case when文

select結果を条件で振り分けるSQL 通常はjoinとかwhere句で振り分けたりしますが

記事を読む

no image

[PostgreSQL][SQL] 文字列関連

PostgreSQLで文字列の処理をしたい場合のTipsをご紹介します。 ①文字列連結

記事を読む

no image

[SQL][集計関数] 行数をカウントするcount関数の解説

count関数について説明します。 count関数は、グループ化した単位での件数をカウントしま

記事を読む

スポンサードリンク

Comment

  1. Ko^2 より:

    参考にさせていただきました

    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

  2. Ko^2 より:

    すみません訂正です。

    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

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スポンサードリンク

no image
[git] Windowsへのインストール(Git for Windows)

概要 Windows環境にGitをインストールします。 インストー

no image
[Fluentd] WindowsにFluentdをインストールする

WindowsにFluentdをインストールしたときのメモ 参考にさ

no image
[Re:dash] BigQuery接続で日本語タイトルを出す(v2.0.0)

BigQueryは現在マルチバイトを含むSQLを発行することができない

no image
[Python] Nullの判定方法(None)

Nullの判定方法(None) 表記方法 Pythonでは、Nul

no image
[Python] 型の検査・判定

Pythonでの型の検査・判定方法 isinstance サン

→もっと見る

  • 2018年8月
    « 6月    
     12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
  • 2018年8月
    « 6月    
     12345
    6789101112
    13141516171819
    20212223242526
    2728293031  
PAGE TOP ↑