【问题标题】:Update second digit in a column更新列中的第二个数字
【发布时间】:2013-04-26 18:32:52
【问题描述】:

如何将 16 位数字中的第二个数字更新为“1”?

这应该很容易,但我没有运气。

我正在使用 SQL Server 2000 和 2005(多个环境 - 相同的数据库表)。

我在网上搜索了解决方案,发现了一个显然可以在 Oracle 中使用的解决方案,但是 SQL Server 在我运行时不喜欢管道符号:

UPDATE INTERFACE
SET OptionBits = substring(OptionBits,1,1)|| replace(substring(OptionBits,2,1), '0', '1')||substring(OptionBits,3, 14)
WHERE ObjectNumber = 5

如您所见,我只想更新对象编号 = 5 的那个。

我曾考虑使用Replace,但这也不是解决方案。

有什么诀窍?

提前致谢!

【问题讨论】:

  • 列的命名表明您实际上将多个数据项存储在单个列中。这通常是一个坏主意,会导致这样的复杂查询。使用 SQL 支持存储多个项目的数据类型(表)会好得多。例如。 CREATE TABLE Options (ObjectNumber int, OptionPosition int, OptionSetting bit).

标签: sql sql-server-2005 sql-update sql-server-2000


【解决方案1】:

'||'符号在 Oracle 中进行字符串连接。 SQL Server 中的等价物是+:

UPDATE INTERFACE
    SET OptionBits = substring(OptionBits,1,1) + replace(substring(OptionBits,2,1), '0', '1') + substring(OptionBits,3, 14)
    WHERE ObjectNumber = 5

【讨论】:

  • 好吧,谢谢 Gordon,我现在有时也不得不使用 Oracle DB,所以像这样的小花絮会非常有用。
【解决方案2】:

对于 MSSQL,the STUFF function 可能是最好的选择:

UPDATE INTERFACE
SET OptionBits = STUFF(OptionBits, 2, 1, '1')
WHERE ObjectNumber = 5

【讨论】:

  • 天啊!既然你提到它是完美的,我应该自己弄清楚,我在它可能是两年前之前使用过这个功能。
猜你喜欢
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2022-11-03
  • 2021-04-10
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
  • 2018-11-11
相关资源
最近更新 更多