如何从nvarchar中获取数字

时间:2011-04-15 13:05:22

标签: sql-server linq

我有一个名为Foo的表,并且有一个名为Bar的列,它是一个nvarchar

Bar的值如下所示:Prefix + Number

示例:

Bar = 'abc123'
Bar = 'a1bc23'

我想选择Bar的Number部分(后半部分),它将是:

123 if Bar = 'abc123'
23 if Bar = 'a1bc23'

假设前缀不以数字结尾我怎样才能获得Bar的数字部分?

注意:

  • 我们不知道前缀的长度
  • T-SQL或LINQ解决方案都可以。

提前感谢您的时间。

2 个答案:

答案 0 :(得分:1)

WITH T(C)
AS
(
SELECT 'a1bc23' UNION ALL 
SELECT 'abc123' UNION ALL 
SELECT 'FOO'    UNION ALL 
SELECT  NULL    UNION ALL 
SELECT '456' 
)
SELECT 
      CASE WHEN C LIKE '%[0-9]' 
           THEN CASE WHEN C LIKE '%[^0-9]%' 
                     THEN RIGHT(C,PATINDEX('%[^0-9]%', REVERSE(C))-1) 
                     ELSE C
                 END
      END AS Number
FROM T 

返回

Number
------
23
123
NULL
NULL
456

答案 1 :(得分:1)

马丁对如何做到这一点有一个很好的答案。虽然我确信这会起作用,但它可能会成为一个昂贵的调用,因为你在字符串字段上做了几次操作。如果您有1000或数百万行,则可能无法实现这一点。

我可能会建议您查看需要执行此操作的原因,并查看是否可以使数据格式化,以便更轻松地处理这种情况。将一个字段拆分为2,并在这些行中包含前缀字段和后缀字段。特别是如果这些是“智能部件号”或类似的东西,您将能够更容易地按语法分组。