【问题标题】:Select Pipe delimited values [duplicate]选择管道分隔值[重复]
【发布时间】:2019-02-14 22:29:53
【问题描述】:

我有一个场景可以从分隔字符串中选择单个值。

例子:

declare @Test varchar(100) = 'ABC|DEF|GHI'

由于数据库是 SQL Server 2008 版本,我无法使用拆分功能。

寻找分别拆分和选择每个值的最佳方法。

【问题讨论】:

    标签: sql sql-server split


    【解决方案1】:

    您可以使用 CharIndex() 来查找分隔符,然后使用 SubString() 在它们之间抓取:

    Declare @Test varchar(100) = 'ABC|DEF|GHI'
    
    Declare @d1 Int = CharIndex('|',@Test,1)
    Declare @d2 Int = CharIndex('|',@Test,@d1+1)
    
    
    Select 
    Substring(@Test,1,@d1-1) As f1,
    Substring(@Test,@d1+1,@d2-@d1-1) As f2,
    Substring(@Test,@d2+1,len(@Test)-@d2) As f3
    

    结果:

    f1  f2  f3
    ABC DEF GHI
    

    【讨论】:

      【解决方案2】:

      您可以在 SQL Server 中创建自己的自定义函数来拆分字符串。您可以为此使用以下功能...

      Create FUNCTION SplitString(@str VARCHAR(8000), @delimiter Varchar(1))
      RETURNS  @Temp Table ( item varchar(100))
      as Begin
      
      Declare @i as int=0
      Declare @j as int=0
      
      Set @j = (Len(@str) - len(REPLACE(@str,@delimiter,'')))
      
      While @i  < = @j
      Begin
        if @i  < @j
        Begin
            Insert into @Temp 
            Values(SUBSTRING(@str,1,Charindex(@delimiter,@str,1)-1))
            set @str = right(@str,(len(@str)- Charindex(@delimiter,@str,1)))
        End
        Else
        Begin
           Insert into @Temp Values(@str)
        End
       Set @i = @i + 1
      End
      
      return;
      End
      go
      
      select * from dbo.SplitString('ABC|DEF|GHI', '|')
      

      【讨论】:

        【解决方案3】:

        评论太长了。最好的方法是不使用分隔值。相反,您可以使用表变量:

        declare @Test table (val varchar(100));
        
        insert into @Test(val)
            values ('ABC', 'DEF', 'GHI');
        

        瞧。没问题。

        【讨论】:

        • 我正在从源中获取分隔值,这是无法控制的编辑
        猜你喜欢
        • 2020-12-16
        • 2014-08-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2020-03-01
        相关资源
        最近更新 更多