【问题标题】:How to get the numeric part from a string using T-SQL?如何使用 T-SQL 从字符串中获取数字部分?
【发布时间】:2012-05-13 16:21:04
【问题描述】:

我有以下字符串。

Input
--------------
2030031469-NAI 

要获取数字部分,我使用以下脚本

declare @str varchar(50)= '2030031469-NAI'

Select 
    @str
    ,SUBSTRING(@str, 1,  NULLIF(CHARINDEX('-', @str) - 1, -1))
        ,Left(@str,PATINDEX('%-%',@str)-1)

得到以下输出

Output: 
----------
2030031469

还有其他简单/优雅的方法吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    从未格式化的字符串中提取数字

    DECLARE @Text NVARCHAR(100)= 'extract only 23124R integer @#%%'
    SELECT SUBSTRING(@Text, PATINDEX('%[0-9]%',@Text), PATINDEX('%[^0-9]%',SUBSTRING(@Text, PATINDEX('%[0-9]%',@Text), LEN(@Text)))-1) [ONLY_INT]
    

    【讨论】:

    • 这在空字符串上失败
    • 我认为首先检查变量然后对其执行任何类型的操作是一个好习惯。至少我就是这么做的。
    【解决方案2】:

    如果您的字符串以字母开头并以 ERT-123

    之类的数字结尾

    你可以使用这个查询:

     (select  substring(@str,patindex('%[0-9]%', @str),len(@str)))
    

    【讨论】:

      【解决方案3】:
      select left(@str, patindex('%[^0-9]%', @str+'.') - 1)
      

      【讨论】:

      • 不适用于 xxx-2030031469。如果能更通用的处理所有情况会更好。
      【解决方案4】:

      请检查一下,我在我的项目中用于提取电话号码

       CREATE Function [dbo].[RemoveNonNumericCharacters](@Temp VarChar(1000))
          Returns VarChar(1000)
          AS
          Begin
      
              While PatIndex('%[^0-9]%', @Temp) > 0
                  Set @Temp = Stuff(@Temp, PatIndex('%[^0-9]%', @Temp), 1, '')
      
              Return @TEmp
          End
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-23
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多