如何拆分字符串值

时间:2015-03-08 12:38:06

标签: sql sql-server

使用SQL Server 2008

我希望用分号分割字符串。字符串值有分号,有时没有分号。

示例#1:

String = abceder-ere1212;eferere2121212 (with Semicolon)

输出

string1 = abceder-ere1212
string2 = eferere2121212

示例#2:

String: abcederdfdfd (without Semicolon)

输出

string1 = abcederdfdfd
string2 = ''

以下代码正常,但我想在查询中的多个位置使用,需要一个函数而不是代码。

DECLARE
    @remarks varchar(max),
    @vc_pen varchar(max), 
    @vc_adjust varchar(max)

Select @remarks  = remarks    
from table1

SELECT   
   @vc_pen = SUBSTRING(S, 1, P - 1),
   @vc_adjust = SUBSTRING(S, P + 1, L - P)
FROM 
   (SELECT
        S = @remarks,
        P = CHARINDEX(';', @remarks),
        L = LEN(@remarks)) s;

如何编写查询或函数来拆分字符串?请帮助

3 个答案:

答案 0 :(得分:0)

尝试类似通用的东西:

CREATE FUNCTION split
( 
    @string VARCHAR(MAX), 
    @delimiter CHAR(1) 
)  RETURNS @output TABLE(index INT, splitteddata VARCHAR(MAX)) 
BEGIN 
    DECLARE @start INT, @end INT, @index INT
    SELECT  @start = 1, @end = CHARINDEX(@delimiter, @string), @index = 1
    WHILE   @start < LEN(@string) + 1 BEGIN 
        IF  @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitteddata)  
        VALUES(@index, SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @index = @index + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)
    END 
   RETURN 
END

Query:
SELECT *
FROM split('abceder-ere1212;eferere2121212',';')
Output:
1 abceder-ere1212
2 eferere2121212

答案 1 :(得分:0)

尝试这样的事情......

测试数据

DECLARE @Table TABLE (ID INT, Value VARCHAR(MAX))

INSERT INTO @Table VALUES 
 (1 , 'abceder-ere1212;eferere2121212')
,(2 , 'abceder-ere1234')

<强>查询

SELECT ID
       ,REPLACE(Split.a.value('.', 'VARCHAR(100)'), '000000', '') Value
       ,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID) Output_Value
FROM   (SELECT ID
               ,Cast ('<M>' + Replace(CASE WHEN Value NOT LIKE '%;%' THEN  Value + ';000000'
                                     ELSE Value END
                      , ';', '</M><M>') + '</M>' AS XML) AS Data
        FROM   @Table) AS A
       CROSS APPLY Data.nodes ('/M') AS Split(a) 

<强>结果

╔════╦═════════════════╦══════════════╗
║ ID ║      Value      ║ Output_Value ║
╠════╬═════════════════╬══════════════╣
║  1 ║ abceder-ere1212 ║            1 ║
║  1 ║ eferere2121212  ║            2 ║
║  2 ║ abceder-ere1234 ║            1 ║
║  2 ║                 ║            2 ║
╚════╩═════════════════╩══════════════╝

如果只有两个可能的值

您可以执行以下操作

测试数据

DECLARE @Table TABLE (ID INT, Value VARCHAR(MAX))

INSERT INTO @Table VALUES 
 (1 , 'abceder-ere1212;eferere2121212')
,(2 , 'abceder-ere1234')

<强>查询

;WITH CTE AS 
( SELECT  ID 
         ,REPLACE(CASE WHEN Value NOT LIKE '%;%' 
               THEN  Value + '|000000'
               ELSE Value END, ';', '|') AS Value
  FROM @Table
)
SELECT ID
      ,LEFT(Value , CHARINDEX('|', Value) -1) FirstValue
      ,REPLACE(RIGHT(Value,  LEN(Value) - CHARINDEX('|', Value)), '000000', '') SecondValue
FROM CTE

结果集

╔════╦═════════════════╦════════════════╗
║ ID ║   FirstValue    ║  SecondValue   ║
╠════╬═════════════════╬════════════════╣
║  1 ║ abceder-ere1212 ║ eferere2121212 ║
║  2 ║ abceder-ere1234 ║                ║
╚════╩═════════════════╩════════════════╝

答案 2 :(得分:0)

尝试使用PARSENAME这样的功能:

SELECT PARSENAME(REPLACE(@remarks, ';', '.'), 2) AS string1,  
       PARSENAME(REPLACE(@remarks, ';', '.'), 1) AS string2  

以下是一个代码,可以在零开的字段中显示您的部件:

DECLARE @text VARCHAR(1000);
SET @text = 'SELECT ''' + REPLACE(@remarks, ';', ''',''') + ''''
EXEC(@text)

另一方面,这更好(将结果发送到表格):

DECLARE @text VARCHAR(1000)
SET @text = 'SELECT ''' + REPLACE(@remarks, ';', ''' As part union all SELECT ''') + ''' As part'
EXEC(@text)

为了得到一个resultTable,将上面改为下面:

SET @text = 'SELECT part INTO resultTable FROM (select ''' + REPLACE(@remarks, ';', ''' As part UniON ALL SELECT ''') + ''' As part) dt '

我认为当您将结果设置为datatablestored procedure时,此答案非常有用。

相关问题