【问题标题】:Getting ranged data value from varchar(500)从 varchar(500) 获取范围数据值
【发布时间】:2021-09-15 14:19:51
【问题描述】:

寻找一些想法。

我正在运行 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”,有没有办法捕捉“Pressure Received:”和“This”之间的值,所以我只得到数值?

谢谢!

【问题讨论】:

  • 抱歉,我指的是一两列,如果您将该行文本放在记事本中并选择某个数字/字母,它会在右下角显示它的列,例如,我根据我的代码在每一行中搜索第 181 列,也许这里的列不是正确的词:) 也许空格是一个更好的词
  • 非常感谢您的提示,我已经更新了我的问题 :)

标签: sql-server substring varchar charindex ssms-2014


【解决方案1】:

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

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

【讨论】:

  • 嗨尼克,感谢您的提示,我认为这只是一个嵌套子字符串?不幸的是,当涉及到更高级的查询时,我是一个新手。即使单词的位置可能并不总是相同,这种方法是否仍然有效?数据值可以保留一位小数。因此字符串的结尾将是数据值之后的“”还是“This”之前的?你能给我看一个例子来更好地帮助我理解吗?谢谢!
  • 我遇到的问题是当我尝试使用字符串“This”的结束位置时,由于行中有多个“This”,它没有拉出正确的位置。有没有办法限制这个子字符串 CharIndex 只查看字符串的特定位置?(181 如我的问题所示)
  • 请用您正在使用的 DBMS 标记您的问题。这些类型的功能通常由每个 DBMS 以特定方式实现,因此在不知道您使用的是哪一个的情况下,不可能给出我们知道对您有用的解决方案。但是,一般来说,CHARINDEX 需要 3 个参数,第 3 个参数是可选的,并且是开始搜索的位置。正是这个起始位置在我的答案的第 1 步中计算出来并插入第 2 步
  • 嗨,尼克,我正在使用 SQL Server Management Studio,谢谢
【解决方案2】:

这里有一个解决方案:

 --==== 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', td.Failure_Reason, p1.pos) + 1))               As p2(pos);

【讨论】:

  • 嗨杰夫!感谢您花时间查看我的问题,我尝试使用您的代码并在我的数据上进行尝试,但我收到错误消息“传递给 LEFT 或 SUBSTRING 函数的长度参数无效。”我认为这是因为“这个”在不同的位置?我通过在“This”之前放置几个空格或删除一个空格来编辑您的示例代码,并且我收到了相同的错误消息。有什么想法吗?
  • 如果字符串不包含值 - 您将收到该错误。您必须有不符合相同结构的行,即 - 它们没有“收到的压力:”或“。这'。
  • 您可以使用子字符串注释掉该列 - 并查看 pos 列。对于那些 p1.pos 或 p2.pos 等于 0 的行是输入字符串有问题的行。您还可以添加 WHERE p1.pos = 0 或 p2.pos = 0 来隔离这些行。
猜你喜欢
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
  • 2021-12-03
相关资源
最近更新 更多