1

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

使用以下查询,这是我的结果:

选择 Column_Desc, Replace(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 你的是什么?

因此,结果(New_Value)应该是 18.8、13.8 和 15.9,数据类型为十进制。我无法让它工作。请指教。谢谢!

4

4 回答 4

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 没有很好的字符串处理功能。因此,能够对您正在寻找的字符串做出这样的假设可以简化代码。

于 2018-09-30T11:56:06.403 回答
0

这将为您提供 % 符号之前的数字作为小数。您需要验证 % 存在于谓词中。

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

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

于 2018-09-30T04:31:03.670 回答
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
于 2018-09-30T04:14:46.040 回答
0

如果字符串中只能有一个这样的数字,并且它总是以数字开头(即没有值在小数点前省略 0 等'.75')并以数字结尾,则可以通过应用于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<>小提琴

于 2018-09-30T04:21:18.877 回答