TSQL从每个逗号分隔值中获取正确的值

时间:2011-08-15 15:56:00

标签: sql sql-server tsql sql-server-2008

12344-23s2 $ 4

我有一个从Feed

收到的值
12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7

所有上述值均以逗号分隔。

对于每个以逗号分隔的值,我只需要在 - (连字符)

之后选择正确的部分

我尝试使用以下声明

right(ID, len(ID) - CHARINDEX('-', ID))

如果我只有一个值,我会得到正确的值..即23s2 $ 4。 但如果我有多个逗号分隔值,我将在第一个之后获得所有值 - 。

我想取每个逗号分隔的值,并且每个值我想只取正确的部分(连字符后)

4 个答案:

答案 0 :(得分:1)

所以你已经解决了单一价值的问题 - 这是一个很好的一步。现在,列出单个值。一种方法是把它变成一张桌子。这是我使用的函数,它将逗号分隔的字符串转换为表格:

CREATE Function [dbo].[ParseStringList]  (@StringArray nvarchar(max) )  
Returns @tbl_string Table  (ParsedString nvarchar(max))  As  

BEGIN 

DECLARE @end Int,
        @start Int

SET @stringArray =  @StringArray + ',' 
SET @start=1
SET @end=1

WHILE @end<Len(@StringArray)
    BEGIN
        SET @end = CharIndex(',', @StringArray, @end)
        INSERT INTO @tbl_string 
            SELECT
                Substring(@StringArray, @start, @end-@start)

        SET @start=@end+1
        SET @end = @end+1
    END

RETURN
END

然后你从表格中选择:

Select ParsedString From dbo.ParseStringList(@StringArray)

所以从这里开始,您可以应用您的解决方案:

Select right(ParsedString, len(ParsedString) - CHARINDEX('-', ParsedString))
From dbo.ParseStringList(@StringArray)

答案 1 :(得分:1)

如果使用SQLBulkCopy,BULK INSERT或bcp导入它,则可以在导入时将CSV拆分为单独的列。然后你的SQL每列工作。

如果你不能这样做,那么将值拆分(见这里:Split function equivalent in T-SQL?)行。

现在您已将CSV(作为行或列)分开使用

  • 上面的正确代码
  • 如果前导值始终为12344,则使用REPLACE (MyValue, '12344-', '')

答案 2 :(得分:1)

您需要在存储过程中执行此操作。在存储过程中,您必须创建一个while循环并循环遍历该字段,直到您处理完所有逗号。

答案 3 :(得分:1)

通常,当您尝试执行此类操作时,您必须创建一个允许您根据分隔符拆分字符串的UDF。这篇文章相当不错:

http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx

You can also看看使用一些XML函数来做到这一点:

Declare @xml as xml,@str as varchar(100),@delimiter as varchar(10)
SET @str='12344-23s2$4, 12344-23s2$5, 12344-23s2$6, 12344-23s2$7'
SET @delimiter =','
SET @xml = cast(('<X>'+replace(@str,@delimiter ,'</X><X>')+'</X>') as xml)
SELECT right(N.value('.', 'varchar(16)'), len(N.value('.', 'varchar(16)')) - CHARINDEX('-', N.value('.', 'varchar(16)'))) as value FROM @xml.nodes('X') as T(N)