【问题标题】:SQL Substring and CharindexSQL 子字符串和字符索引
【发布时间】:2021-11-10 05:45:42
【问题描述】:

我在一列中有 111-1001-0000-0000 这条记录,在第二列中有 453200-0000-000

我希望输出为 111-1001-0000-453200-0000-0000-000

这意味着第一列的 111-1001-0000 和第二列的 453200 以及第一列的 0000 和 0000-000 从第二列

我尝试了以下查询,但得到了 111-1001-453200-0000-0000-000。

第一列缺少-0000

Declare @1stcolumn nvarchar(30),@2ndcolumn nvarchar(30)

set @1stcolumn='111-1001-0000-0000'
            
set @2ndcolumn='453200-0000-000' 

select substring(@1stcolumn,1,charindex(right(@1stcolumn,charindex('-',reverse(@1stcolumn))),@1stcolumn))
+substring(@2ndcolumn,1,charindex('-',@2ndcolumn))+reverse(substring(reverse(@1stcolumn),0,charindex('-',reverse(@1stcolumn))))
+'-'+substring(@2ndcolumn,charindex('-',@2ndcolumn)+1,len(@2ndcolumn)) 

【问题讨论】:

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


    【解决方案1】:

    找到拆分列 1 和列 2 的位置。使用LEFT()RIGHT() 拆分字符串,然后按您想要的顺序连接回来

    ; with tbl as
    (
        select  col1 = @1stcolumn, col2 = @2ndcolumn
    )
    select  *,
            c1.s1 + '-' + c2.s1 + '-' +c1.s2 + '-' + c2.s2
    from    tbl t
            cross apply
            (
                select  s1 = left(col1, p - 1),
                        s2 = right(col1, len(col1) - p)
                from    (
                            -- find the position of 3rd '-' by cascading charindex
                            select  p = charindex('-', col1, 
                                             charindex('-', col1, 
                                                 charindex('-', col1) + 1) + 1)
                        ) p
            ) c1
            cross apply
            (
                select  s1 = left(col2, p - 1),
                        s2 = right(col2, len(col2) - p)
                from    (
                            select  p = charindex('-', col2)
                        ) p
            ) c2
    

    【讨论】:

      【解决方案2】:

      在第一个substring 中稍作修改。为了获得正确的长度,我使用了 LEN

      select substring(@1stcolumn,1,(Len(@1stcolumn) - charindex('- ',REVERSE(@1stcolumn)) + 1))
      +substring(@2ndcolumn,1,charindex('-',@2ndcolumn))
      +reverse(substring(reverse(@1stcolumn),0,charindex('-',reverse(@1stcolumn))))
      +'-'+substring(@2ndcolumn,charindex('-',@2ndcolumn)+1,len(@2ndcolumn)) 
      

      【讨论】:

        【解决方案3】:

        我可能会使用PARSENAME,因为它非常简洁:

        WITH YourTable AS(
            SELECT '111-1001-0000-0000' AS Column1,
                   '453200-0000-000' AS Column2)
        SELECT CONCAT_WS('-',PN.C1P1,PN.C1P2,PN.C1P3,PN.C2P1,PN.C1P4,PN.C2P2,PN.C2P3) AS NewString
        FROM YourTable YT
             CROSS APPLY (VALUES(REPLACE(YT.Column1,'-','.'),REPLACE(YT.Column2,'-','.')))R(Column1,Column2)
             CROSS APPLY (VALUES(PARSENAME(R.Column1,4),PARSENAME(R.Column1,3),PARSENAME(R.Column1,2),PARSENAME(R.Column1,1),PARSENAME(R.Column2,3),PARSENAME(R.Column2,2),PARSENAME(R.Column2,1)))PN(C1P1,C1P2,C1P3,C1P4,C2P1,C2P2,C2P3);
        

        【讨论】:

          【解决方案4】:
          WITH
            test AS
          (
          select '111-1001-0000-0000' as col1, '453200-0000-000' as col2
          )
          ,cte as
          (
          select 
                 col1,
                 col2,
                 substring
                                    (
                                    col1,
                                    0,
                                    len(col1)-charindex('-',reverse(col1))
                                    ) as part1,
                  substring
                                    (
                                    col2,
                                    0,
                                    len(col2)-charindex('-',col2) - 1
                                    ) as part2
          from test
          ),
          cte2 as
          (
          select 
                  part1,
                  part2,
                  substring
                                    (
                                    reverse(col1),
                                    0,
                                    charindex('-',reverse(col1))
                                    ) as part3,
                  substring
                                    (
                                    col2,
                                    charindex('-',col2)+1,
                                    len(col2)-charindex('-',col2)+1
                                    ) as part4
          from cte
          )
          select part1+'-'+part2+'-'+part3+'-'+part4
          from cte2
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-07-20
            • 2019-06-03
            • 1970-01-01
            • 1970-01-01
            • 2013-07-15
            • 1970-01-01
            • 2010-12-15
            • 2018-01-09
            相关资源
            最近更新 更多