2016-11-07 48 views
-1

我正在使用Oracle DB。通過使用sql的分割函數獲得正確的結果

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

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

在上面的查詢中只會得到第一個值(123)。 有什麼辦法從上面的查詢中獲取所有的值。

我想造成象下面這樣一個查詢:

result 
123 
45 
6 
7 
+3

將鼠標懸停在問題底下的sql標籤上。它說:「問題應該包括代碼示例,表結構,示例數據,**和DBMS實現的標記(例如MySQL,PostgreSQL,Oracle,MS SQL Server,IBM DB2)***」... –

+2

請使用實際的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')