2016-11-07 22 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')