我尝试使用patindex查找字符串中数字值的开头。我的目标是从字符串中提取不包括%的数字部分。
通过以下查询,这是我的结果:
选择Column_Desc, 将(substring([Column_Desc],PatIndex('%[0-9]%',[Column_Desc]),len([Column_Desc])),'%','')替换为New_Value
Column_Desc
新值
因此,结果(新值)应为18.8、13.8和15.9,数据类型为十进制。我无法使其正常工作。请指教。谢谢!
答案 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;
答案 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没有很好的字符串处理功能。因此,能够对要查找的字符串进行这样的假设可以简化代码。