sql - 数字上的sql server中的子字符串

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

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

相关文章:

java - JDBC 中的 SELECT 语句

SQL JSON_VALUE/JSON_QUERY 从数组并转置为行

sql-server - T-SQL 中的 CASE 语句或函数具有更好的性能

c# - 如何在一定时间后自动删除sql server中的记录

t-sql - SQL Server 将列转换为标识列

sql-server-2008 - 从 MS SQL Server Management Studio 中的查询结果复制大量数据

sql-server - 有没有一种方法可以在不使用 SQL Server 中的 ComputerName 的情况下连接 LOCALHOST?

mysql - 如何为没有内容的行打印零?

php - 通过 SQL 注入(inject)从数据库中提取信息

mysql - sql:使用同一键左连接多表