【问题标题】:Substring in sql server on numberssql server中关于数字的子字符串
【发布时间】:2013-07-26 05:20:04
【问题描述】:

我有一个名为“PersonNameID”的列名

包含两个值

ABCD-GHJI
ABHK-67891
HJKK-HJJJMH-8990

我只需要提取“-”之后包含数字的“PersonNameID”的第一部分。理想情况下我的输出应该是

ABCD-GHJI
ABHK
HJKK-HJJJMH

但是当我使用以下代码时:

SELECT TOP 100

     CONVERT(NVARCHAR(100),

     SUBSTRING(PersonNameID, 1,
          CASE
               WHEN CHARINDEX('-', PersonNameID) > 0 
                    THEN LEN(PersonNameID) - 
                         LEN(REVERSE(SUBSTRING(REVERSE(PersonNameID), 1, CHARINDEX('-', REVERSE(PersonNameID))))) 
                    ELSE LEN(PersonNameID)

          END
     )
     ) AS New_PersonNameID
FROM Person

我得到的输出为

ABCD
ABHK
HJKK

对上述代码进行任何修改以获得所需的输出?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005 sql-server-2008-r2


    【解决方案1】:

    使用模式匹配找到数字,然后找出数字的位置

    SELECT
        LEFT(PersonNameID,
                CASE WHEN PersonNameID LIKE '%[0-9]%' AND CHARINDEX('-', PersonNameID) > 0
                THEN 
                    CHARINDEX('-', PersonNameID)-1 
                ELSE 
                    LEN(PersonNameID) 
                END) AS NewPersonId
    FROM 
        Person
    

    【讨论】:

      【解决方案2】:

      怎么样

      DECLARE @Person TABLE(
              PersonNameID VARCHAR(50)
      )
      
      INSERT INTO @Person VALUES ('ABCD-GHJI'),('ABHK-67891')
      
      SELECT           top 100 
      CASE
          WHEN CHARINDEX('-',PersonNameID ) = 0
              THEN PersonNameID
          WHEN ISNUMERIC(RIGHT(PersonNameID,LEN(PersonNameID) - CHARINDEX('-',PersonNameID ))) = 0
              THEN PersonNameID
          ELSE LEFT(PersonNameID, CHARINDEX('-',PersonNameID )-1)
      END AS New_PersonNameID
      from @Person
      

      SQL Fiddle DEMO

      【讨论】:

      • 假设名字 Duthja - AEPD - 700358492 上面的查询将给出整个事情
      • 你试过了吗?看看这个例子。它似乎工作。 sqlfiddle.com/#!6/d41d8/5881
      • 是的,我试过 Duthja - AEPD - 700358492 将保留 Duthja - AEPD - 700358492
      【解决方案3】:
        SELECT TOP 100
                   (CASE 
          WHEN CHARINDEX('-',PersonNameID )>0 AND 
                iSNUMERIC( rIGHT(PersonNameID ,CHARINDEX('-',PersonNameID )))=1
              THEN 
              lEFT(PersonNameID ,CHARINDEX('-',PersonNameID)-1)
             ELSE  
              PersonNameID
               END
              )  AS New_PersonNameID
                  FROM Person
      

      SQL FIDDLE DEMO

      【讨论】:

        【解决方案4】:

        “-”之后的任何数字都将被删除。您可以根据需要使用 patindex 模式。

        SELECT 
            CASE WHEN PATINDEX('%-_[0-9]%',PersonNameID)>0 THEN LEFT(PersonNameID,CHARINDEX('-',PersonNameID)-1)
                 ELSE PersonNameID
            END 
            AS New_PersonNameID
        FROM Person
        

        【讨论】:

          【解决方案5】:

          我已经找到了解决上述情况的方法……

          DECLARE @Person TABLE(
          Person_NAME_Original VARCHAR(500),
          Person_NAME_Modified VARCHAR(500)
          )           
          
          INSERT INTO @Person (Person_NAME_Original,Person_NAME_Modified)
          
          SELECT top 1000 PersonNameID,
                 CASE WHEN CHARINDEX('-',PersonNameID) = 0
                           THEN PersonNameID
                      WHEN iSNUMERIC( rIGHT(PersonNameID ,CHARINDEX('-',REVERSE(PersonNameID))-1))=1
                           THEN  LEFT(PersonNameID, len(PersonNameID) - CHARINDEX('-',REVERSE(PersonNameID) )-1)
                      ELSE PersonNameID
                 END AS New_PersonNameID
          from Person                                
          
          select * from @Person         
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-10-20
            • 2016-05-28
            • 2017-01-12
            相关资源
            最近更新 更多