从字符串中仅找出数字部分并将其存储为十进制数据类型

时间:2018-09-30 03:28:56

标签: sql patindex

我尝试使用patindex查找字符串中数字值的开头。我的目标是从字符串中提取不包括%的数字部分。

通过以下查询,这是我的结果:

选择Column_Desc, 将(substring([Column_Desc],PatIndex('%[0-9]%',[Column_Desc]),len([Column_Desc])),'%','')替换为New_Value

Column_Desc

  1. 我的税率是18.8%**。
  2. 我的税率是13.8%。
  3. 我的税率15.9%您的税率是多少?

新值

  1. 18.8
  2. 13.8是我的税率。
  3. 15.9你是什么人?

因此,结果(新值)应为18.8、13.8和15.9,数据类型为十进制。我无法使其正常工作。请指教。谢谢!

4 个答案:

答案 0 :(得分:0)

如果数字后面始终有一个百分号,则可以尝试以下操作,然后将结果转换或转换为十进制。

Select 
    Column_Desc 
    ,Replace(
            substring([Column_Desc], 
                    PatIndex('%[0-9]%', [Column_Desc]), 
        len([Column_Desc]))
        ,'%','') as New_Value
    ,PatIndex('%[0-9]%', [Column_Desc])  as pat_Value
    ,PatIndex('%[%]%', [Column_Desc])  as pct_Value
    ,SUBSTRING(
        [Column_Desc],
        PatIndex('%[0-9]%', [Column_Desc]),
        PatIndex('%[%]%', [Column_Desc]) - PatIndex('%[0-9]%', [Column_Desc]) 
        ) as result_Value

From patindex

答案 1 :(得分:0)

如果字符串中只能有一个这样的数字,并且如果它始终以数字开头(即,没有任何值像'.75'这样在小数点前省略0并以数字结尾,则可以找到通过将patindex()应用于字符串(如您已经做的那样)来获取第一位数字,而通过将patindex()应用于字符串的reverse()来获取最后一位数字。

SELECT convert(decimal(3, 1),
               substring(column_desc,
                         patindex('%[0-9]%',
                                  column_desc),
                         len(column_desc)
                         - patindex('%[0-9]%',
                                    column_desc)
                         - patindex('%[0-9]%',
                                    reverse(column_desc))
                         + 2)) new_value
FROM elbat;

db<>fiddle

答案 2 :(得分:0)

这将只为您提供%符号前的数字(十进制)。您需要验证谓词中是否存在%。

选择CAST(TRIM(SUBSTRING(Column_Desc,LOCATE('%',Column_Desc)-4,LOCATE('%',Column_Desc)-1))AS DECIMAL(3,1))

在您的问题中,您将结果显示为: 13.8是我的税率。 如果这是一个字段,则必须是某种文本字段。那么您最好将%替换为''

答案 3 :(得分:0)

在您的示例中,数字都正好是4个字符长。如果始终都是这样,那么最简单的方法是:

select Column_Desc,
       convert(decimal(5, 1),
               left(stuff(Column_Desc, 1,
                          patindex('%[0-9]%', Column_Desc) - 1, ''), 4)
              ) as new_value

这里是db<>fiddle

SQL Server没有很好的字符串处理功能。因此,能够对要查找的字符串进行这样的假设可以简化代码。