【问题标题】:SQL Server: How to return rounded value by removing zerosSQL Server:如何通过删除零返回舍入值
【发布时间】:2016-03-02 14:15:22
【问题描述】:

我有第 01 列中的值,我想将其转换为第 02 列中的值,从末尾删除所有零。有没有办法在 SQL server 中做到这一点?

Column 01    Column 02 
20100000   201
29050000   2905

感谢期待。

【问题讨论】:

  • 这可能是字符串处理,但不是数值。
  • 这些列的数据类型是什么?
  • 数据类型为整数,字段长度为4,可以存储-2,147,483,648到2,147,483,647之间的值
  • @Ivan,没错。这些不是数值
  • ...不是数字而是整数?

标签: sql sql-server sql-server-2008 sql-server-2012 sql-server-2008-r2


【解决方案1】:

只有你可以使用正整数:

CREATE TABLE #tab(col1 INT);
INSERT INTO #tab(col1) VALUES (20100000),(29050000);

SELECT col1, REVERSE(REVERSE(col1) + 0) + 0 AS trimmed
FROM #tab;

LiveDemo

输出:

╔══════════╦═════════╗
║   Col1   ║ trimmed ║
╠══════════╬═════════╣
║ 20100000 ║     201 ║
║ 29050000 ║    2905 ║
╚══════════╩═════════╝

它是如何工作的:

  1. 倒数 -> 字符串
  2. 添加0 -> 隐式转换为INT。您可以使用CAST/CONVERT 来明确表达!
  3. 再次反转 -> 字符串
  4. 添加0 -> 转换为INT

20100000 -> "0000102" -> 102 -> "201" -> 201

附录

还添加了对负整数的支持:

SELECT col1, SIGN(col1) * REVERSE(REVERSE(ABS(col1)) + 0) AS trimmed
FROM #tab;

LiveDemo2

【讨论】:

  • 这很好。但我想知道为什么你更喜欢对 int 执行隐式转换而不是仅仅转换为 int?
  • @Lamak 我有点懒。而真正的原因是+0CASTCONVERT 短:)
  • @Lad.. 它对我有用,谢谢你的快速帮助.. Hi5
【解决方案2】:

或者另一种方法是创建一个函数来删除多余的零,如下所示:

CREATE FUNCTION dbo.RemoveZeros(
   @value BIGINT
) RETURNS BIGINT AS
BEGIN
    DECLARE @str NVARCHAR(50)
    SET @str = CAST(@value AS NVARCHAR(50))
    WHILE ((LEN(@str)>0) AND (RIGHT(@str,1)=N'0'))
        SET @str = LEFT(@str,LEN(@str)-1)

    RETURN @str
END

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2019-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    相关资源
    最近更新 更多