3

我有一个名为“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

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

4

5 回答 5

2

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

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
于 2013-07-26T05:32:33.957 回答
1

像这样的东西怎么样

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 小提琴演示

于 2013-07-26T05:30:50.613 回答
1
  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 小提琴演示

于 2013-07-26T05:31:12.270 回答
1

'-' 之后的任何数字都将被删除。您可以使用 patindex 模式来满足您的需要。

SELECT 
    CASE WHEN PATINDEX('%-_[0-9]%',PersonNameID)>0 THEN LEFT(PersonNameID,CHARINDEX('-',PersonNameID)-1)
         ELSE PersonNameID
    END 
    AS New_PersonNameID
FROM Person
于 2013-07-26T07:03:05.053 回答
0

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

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         
于 2013-07-29T10:43:49.800 回答