2016-11-07 10 views
-1

Oracle DBを使用しています。sqlのsplit関数を使用して正しい結果を得る

select split('123,45,6,7',1,',') from dual ; 

--------------------------------------------------------------------- 
result 
123 
--------------------------------------------------------------------- 

上記のクエリでは、最初の値(123)のみが結果になります。 上記のクエリからすべての値を取得する方法はありますか。

私は1つのクエリで以下のようになりたい:

result 
123 
45 
6 
7 
+3

質問の下にあるsqlタグにカーソルを合わせます。 * "質問にはコード例、テーブル構造、サンプルデータ、DBMS実装のタグ(MySQL、PostgreSQL、Oracle、MS SQL Server、IBM DB2など)***を含める必要があります。" ... –

+2

Pleaseあなたの質問に実際のRDBMS(製品とバージョン)を付けてください。 'sql'タグは十分ではありません... – Shnugo

+1

Postgresで' unnest(string_to_array(...) 'を使用してください。 –

答えて

0

このよう

DECLARE @Str VARCHAR(100)= '123,45,6,7' ;WITH _CTE (_Str , _RemStr) AS 
    (
    SELECT SUBSTRING(@Str,0,CHARINDEX(',',@Str)) , 
      SUBSTRING(@Str,CHARINDEX(',',@Str)+1,LEN(@Str)) 
    UNION ALL 
    SELECT CASE WHEN CHARINDEX(',',_RemStr) = 0 THEN _RemStr ELSE SUBSTRING(_RemStr,0,CHARINDEX(',',_RemStr)) END,   
      CASE WHEN CHARINDEX(',',_RemStr) = 0 THEN '' ELSE SUBSTRING(_RemStr,CHARINDEX(',',_RemStr)+1,LEN(_RemStr)) END 
    FROM _CTE   
    WHERE _RemStr <> '' 
) 
SELECT _Str 
FROM _CTE 
0

分割文字列のための機能を、以下の利用

Create FUNCTION [dbo].[SplitString] 
(
    @INPUT nvarchar(max) 
) 
RETURNS 
@ParsedList table 
(
    OrderID int 
) 
AS 
BEGIN 
    DECLARE @OrderID varchar(10), @Pos int 

    SET @INPUT = LTRIM(RTRIM(@INPUT))+ ',' 
    SET @Pos = CHARINDEX(',', @INPUT, 1) 

    IF REPLACE(@INPUT, ',', '') <> '' 
    BEGIN 
     WHILE @Pos > 0 
     BEGIN 
      SET @OrderID = LTRIM(RTRIM(LEFT(@INPUT, @Pos - 1))) 
      IF @OrderID <> '' 
      BEGIN 
       INSERT INTO @ParsedList (OrderID) 
       VALUES (CAST(@OrderID AS int)) --Use Appropriate conversion 
      END 
      SET @INPUT = RIGHT(@INPUT, LEN(@INPUT) - @Pos) 
      SET @Pos = CHARINDEX(',', @INPUT, 1) 

     END 
    END 
    RETURN 
END 

を試してみて、

Select * from [SplitString]('123,45,6,7') 
の下に実行
関連する問題