【问题标题】:Problem with using SUBSTRING and CHARINDEX使用 SUBSTRING 和 CHARINDEX 的问题
【发布时间】:2021-09-09 17:00:00
【问题描述】:

我在表中有一个列 (RCV1.ECCValue),99% 的时间都有一个常量字符串格式——例如:

T0-11.86-273

两个连字符的中间部分是百分比。我正在使用下面的 sql 来获取这个工作正常的数字,并在上面的示例中返回 11.86。 该表中的数据采用上述格式时

'Percentage' = round(SUBSTRING(RCV1.ECCValue,CHARINDEX('-',RCV1.ECCValue)+1, CHARINDEX('-',RCV1.ECCValue,CHARINDEX('-',RCV1.ECCValue)+1) -CHARINDEX('-',RCV1.ECCValue)-1),2) ,

但是...此表是从外部源更新的,并且分隔符偶尔会有所不同,例如:

T0-11.86_273

当发生这种情况时,我得到错误:

传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

我对 SQL 很陌生,已经摆脱了许多挑战,但这个让我陷入了困境。任何帮助将不胜感激。有没有更好的方法来提取这个百分比值?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 你知道百分比是否总是从第 4 个字符开始?它总是有 2 个小数点吗?

标签: sql sql-server


【解决方案1】:

在 CHARINDEX 中将 '_' 替换为 '-' 为字符串,同时指定子字符串的长度

'Percentage' = round(SUBSTRING(RCV1.ECCValue,CHARINDEX('-',RCV1.ECCValue)+1, CHARINDEX('-',replace(RCV1.ECCValue,'_','-'),CHARINDEX('-',RCV1.ECCValue)+1) -CHARINDEX('-',RCV1.ECCValue)-1),2) ,

【讨论】:

  • 这个解决方案非常适合我的需要。非常感谢。
【解决方案2】:

如果你能保证这些字符串的结构,你可以试试parsename

select round(parsename(translate(replace('T0-11.86_273','.',''),'-_','..'),2), 2)/100

步骤分解

  • 使用replace将百分比值中的.字符替换为空字符串。
  • 使用translate-_ 替换为.
  • 使用parsename解析第二个元素。
  • 四舍五入到 2 位,这也将 自动将其转换为所需的数字类型。
  • 除以 100 将数字恢复为百分比。

Documentation & Gotchas

【讨论】:

    【解决方案3】:

    使用NULLIF 清除此类值

    round(
      SUBSTRING(
        RCV1.ECCValue,
        NULLIF(CHARINDEX('-', RCV1.ECCValue), 0) + 1,
        NULLIF(CHARINDEX('-',
                  RCV1.ECCValue,
                  NULLIF(CHARINDEX('-', RCV1.ECCValue), 0) + 1
           ), 0)
           - NULLIF(CHARINDEX('-', RCV1.ECCValue), 0) - 1
      ),
    2)
    

    我强烈建议您将重复的值放在CROSS APPLY (VALUES 中以避免重复自己。并且一定要使用空格,它是免费的。

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 2012-02-24
      • 2013-05-29
      • 2017-07-28
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2013-05-22
      相关资源
      最近更新 更多