[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

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

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

記事を読む

no image

[PostgreSQL][SQL] 日付関連

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

記事を読む

no image

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

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

記事を読む

no image

[RDB][SQL] JOINについて

JOINについて説明します。 まず、以下の2つのテーブルがあります。 簡単なテーブルなので、

記事を読む

no image

[SQLServer] 日付の加算・減算

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

記事を読む

no image

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

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

記事を読む

no image

[PostgreSQL][SQL] csvファイルのインポート

PostgreSQLでcsvファイルをインポートする際の方法を解説します。 例題として、以下の

記事を読む

no image

[SQLServer] 当日0時や月初0時の取得方法

当日0時や月初0時の取得方法です。 当日0時 DATEADD関数の2番目の引数にDATEDI

記事を読む

no image

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

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

記事を読む

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
CentOSにdockerをインストールしてみた

前置き dockerをcentos7にインストールしてみました

no image
awkでのgsubを使った文字列置換(正規表現)

まえおき bashなどのシェルスクリプトで、lsした結果とかを

no image
bashで並列処理する方法(xargs)

並列処理とは 通常、意識せずにプログラムを書くと、大体の場合は

no image
AWS Redshiftの使用ストレージ容量をクエリで調べる方法

用途 AWS Redshfitのコンソールを見れば、使用中のス

no image
pythonでstorage transfer serviceを使ってみた。

準備 pythonのインストールとかする。 このあたり。

→もっと見る

  • 2024年12月
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031  
  • 2024年12月
     1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031  
PAGE TOP ↑