【问题标题】:Push data from one column to another in the same table在同一个表中将数据从一列推送到另一列
【发布时间】:2019-12-22 05:52:17
【问题描述】:

我需要将数据类型为 varchar 的 OrderNumber 列中的值移动到名为 NewNumber 的同一个表中的新列,该表的数据类型为 bigint。所以我有很多值,这里有几个来自 OrderNumber 列:

-ON12747583
-1749475944

我希望能够将这些值放在我的 NewNumber 列中,该列是一个 bigint,并修剪掉前导的“ON”。所以我应该看到:

NewNumber:  12747583,1749475944
OrderNumber: ON12747583,1749475944

注意:逗号只是为了将值相互分隔,它们不在同一行。

【问题讨论】:

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


    【解决方案1】:

    您可以使用 REPLACE() 函数作为

    CREATE TABLE T(
      Old VARCHAR(45),
      New BIGINT
    );
    
    INSERT INTO T(Old) VALUES
    ('ON12747583'),
    ('1749475944');
    
    UPDATE T
    SET New = REPLACE(Old, 'ON', '')
    FROM T;
    

    更新:

    我想您存储了一些不适合 BIGINT 的数据,因为您坚持认为除了 'ON' 之外没有其他字符。所以我建议你把数据类型改成

    ALTER TABLE T
    ALTER COLUMN New DECIMAL(38, 0);
    

    然后运行查询

    UPDATE T
    SET New = REPLACE(Old, 'ON', '')
    FROM T;
    --WHERE if needed
    

    【讨论】:

    • 不需要CASE,你可以使用REPLACE
    • @scsimon 是的,有时我搞砸了。 :)
    • SELECT * FROM T WHERE TRY_CAST(REPLACE(Old, 'ON', '') AS BIGINT) IS NULL的结果是什么?
    • 那么你不在 SQL Server 2012 上,你已经标记了 @an1234
    • @Sami 除了ON之外绝对没有其他非数字字符
    【解决方案2】:

    我建议为此使用STUFF()

    UPDATE T
        SET NewNumber = STUFF(OrderNumber, 1, 2, '')
        WHERE OrderNumber LIKE 'ON%';
    

    您想使用STUFF(),因此替换特定于第一个'ON'。在这种情况下,您可能知道数字的其余值,但我认为使用STUFF() 而不是REPLACE() 是一个好习惯。

    其次,您想使用WHERE 子句限制正在更新的行。即使没有值更改,SQL Server 也会产生更新行的开销。如果可以的话,你想避免这种开销。

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多