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

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

最佳答案

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

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

关于sql - sql server 中数字的子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17873490/

10-11 17:25