从 varchar(500) 获取范围数据值

问题描述

寻找一些想法。

我正在运行 sql Server 2014。我有一个 varchar(500) 列,其中包含我需要从每一行中提取的数据值,但是,它并不总是在行上的相同位置(有时会关闭)由 1 或 2 个位置)所以我在使用子字符串时遇到困难:

substring(Failure_Reason,charindex('Pressure received:',Failure_Reason + 181,5) as 'Test'

使用这行代码,大多数时候我得到了正确的数据值,但有时我得到一个像'67.T'这样的值

varchar 列的内容是:

Settings received from Creep tester are outside expected values for pouch 3.            Pressure Duration received : 0. This value should be 32 +/- 2.          Pressure received : 198.5. This value should be between 202.77 and 197.24..

语言总是相同但数据值会不同

我只是想在“收到压力:”之后解析出值,但由于在某些行中可能有一个或两个位置,我有时会拉入“。”或“T”,有没有办法捕捉“收到的压力:”和“这个”之间的值,所以我只能得到数值?

谢谢!

解决方法

以下内容应向您展示如何处理此问题:

  1. 起始位置是字符串“收到压力:”的位置+该字符串的长度+ 1
  2. 结束位置是字符串 "This" - 1 的位置,从步骤 1 中计算出的位置开始搜索此字符串
  3. 获取上一步计算出的两个值之间的子串
  4. 修剪子串
  5. 如果子串中的最后一个字符是“.”,则再次将其子串成比当前长度少 1 的长度
,

这是一个解决方案:

 --==== Setup some test data
Declare @testData Table (Failure_Reason varchar(500));
 Insert Into @testData (Failure_Reason)
 Values ('Settings received from Creep tester are outside expected values for pouch 3.            Pressure Duration received : 0. This value should be 32 +/- 2.          Pressure received : 198.5. This value should be between 202.77 and 197.24..'),('Settings received from Creep tester are outside expected values for pouch 3.            Pressure Duration received : 0. This value should be 32 +/- 2.          Pressure received : 98.5. This value should be between 202.77 and 197.24..'),('Settings received from Creep tester are outside expected values for pouch 3.            Pressure Duration received : 0. This value should be 32 +/- 2.          Pressure received : 8.5. This value should be between 202.77 and 197.24..');

 --==== Solution
 Select *,PressureReceived = substring(td.Failure_Reason,p1.pos,p2.pos - p1.pos - 1)
   From @testData                                                                         As td
  Cross Apply (Values (charindex('Pressure received :',td.Failure_Reason,1) + 20))      As p1(pos)
  Cross Apply (Values (charindex('. This',p1.pos) + 1))               As p2(pos);