【问题标题】:SQL Server - Delete Values after Decimal (non-int field)SQL Server - 删除十进制后的值(非整数字段)
【发布时间】:2016-08-16 05:27:42
【问题描述】:

在 SQL 表中有一个 ncarchar(MAX) 字段。它有 717.08064182582、39.0676048113 等数字,其中我只需要小数点后 3 位。例如 717.080、39.067。

在不转换字段类型的情况下,想去掉最后 n 个字符,但是每一行都有不同数量的字符。我相信我可以使用 ROUND(如果错了请纠正我),但我宁愿不使用。

【问题讨论】:

  • SELECT CASE WHEN PATINDEX('%.%', @nvar) > 0 THEN SUBSTRING(@nvar, 1, PATINDEX('%.%', @nvar) + 3) ELSE @nvar END
  • 我的问题是你为什么首先将数字存储为字符串???
  • @SeanLange 也许它是那些邪恶的 EAV 表之一
  • @JamieD77 哈哈。我不认为所有的 EAV 都是邪恶的,但这很可能就是这种情况。

标签: sql sql-server decimal rounding nvarchar


【解决方案1】:

试试这个

SELECT CAST(ColumnName AS DECIMAL(18,3))

不转换数据类型根据@vkp评论

SELECT SUBSTRING(ColumnName ,0,CHARINDEX('.', ColumnName )+4)

【讨论】:

  • 不转换字段类型
  • 这将隐式舍入,即717.08064182582 变为717.081。我不确定这是 OP 想要的,在示例中请求的结果是 717.080
  • @HoneyBadger:OP 表示他可以使用ROUND
  • 但 OP 也声明“不转换字段类型”。相互矛盾的信息:P
  • @vkp 不转换怎么可能得到预期的结果?
【解决方案2】:

试试这个:

SELECT  SUBSTRING(Your_column, 1, PATINDEX('%.%', Your_column) + 3)
FROM    Your_Table

【讨论】:

    【解决方案3】:
    select  CASE    WHEN    CHARINDEX('.', Your_column) > 0 
                    THEN    SUBSTRING(Your_column, 1, CHARINDEX('.', Your_column) + 3)
                    ELSE    Your_column
            END
    

    这与之前的答案类似,但更快更安全

    【讨论】:

      猜你喜欢
      • 2011-04-28
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-18
      • 2011-02-25
      • 1970-01-01
      • 2012-02-21
      相关资源
      最近更新 更多