【问题标题】:Bit wise operation on float value on SQL Server 2016SQL Server 2016 上浮点值的按位运算
【发布时间】:2017-02-15 23:38:12
【问题描述】:

我想通过以下代码在 SQL 上进行位切换来执行简单的更新。

UPDATE table SET BoolFields = BoolFields + 1.0 WHERE BoolFields & 1.0 <> 1.0

但是,当我在 Management Studio 上运行它时,我收到了

操作数数据类型float对于'&'运算符无效。

在不将 BooFields 从 float 更改为其他类型的情况下,是否有人可以解决此问题?

编辑

有些人评论我的情况不清楚所以编辑。

条件是我想检查某个位是否被标记为 1。 所以我的实际线路可能是BoolFields & 128.0 <> 128.0

然后

我想SET BoolFields = BoolFields + 128.0

所以我只想在布尔值未标记为 1 时标记它。

【问题讨论】:

  • 如果您能知道update 应该在什么条件下执行,那将会有所帮助?问题不清楚。
  • 请解释一下,你想达到什么目的。这闻起来像 XY-problem...
  • 按位在 float 上?你为什么要使用浮点数,尤其是在存储位时?
  • 通读代码后,代码解释器确实将它们存储为纯整数。不过,它似乎被 SSMS 识别为浮动。

标签: sql sql-server ssms sqlcommand


【解决方案1】:

如果你真的需要在你的 浮点值上使用 bitwise 运算符 - 它不支持它们 - 你需要将它们转换为支持按位运算的类型,例如 @987654322 @ 或int(此处列出https://msdn.microsoft.com/en-us/library/ms176122.aspx),即:

update table set BoolFields = BoolFields + 1.0 where cast(BoolFields as int) & 1 <> 1

但在我看来,您应该考虑对浮点数范围进行操作,而不是强制按位运算符。也许你应该描述一个用例来阐明你为什么要这样做。

【讨论】:

  • 谢谢。这解决了我的问题。我们的代码确实使用了超过 16 位,所以我们确实需要 32 位存储,但我希望我们使用 bigint 而不是 float 来存储位信息。但我无权更改类型。
  • 好吧 int 有 32 位而不是 16 位。所以我真的不知道为什么我们使用浮点数,但我们是。而且如上所述,我无法更改类型...
猜你喜欢
  • 2011-07-17
  • 2015-05-25
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多