【问题标题】:Union of two boolean Rows with the same tag具有相同标签的两个布尔行的并集
【发布时间】:2013-04-15 09:40:28
【问题描述】:

我有一个 select 语句,它为每个标签返回一个元素数组:

|TAG  | Bool1 | Bool2 | Bool3 |
|-----------------------------|
|tag1 |  0    |   1   |  0    |
|tag1 |  1    |   1   |  0    |
-------------------------------

我希望结果是两行与 OR 语句的并集:

_______________________________
|TAG  | Bool1 | Bool2 | Bool3 |
|-----------------------------|
|tag1 |  1    |   1   |  0    |
-------------------------------

【问题讨论】:

  • 为什么 Bool2=0 如果相同的 Bool1=1?

标签: sql sql-server sql-server-2008 stored-procedures sql-server-2012


【解决方案1】:
SELECT TAG,
    CAST(MAX(CAST(Bool1 as int)) as bit) as Bool1,
    CAST(MAX(CAST(Bool2 as int)) as bit) as Bool2,
    CAST(MAX(CAST(Bool3 as int)) as bit) as Bool3
from Table group by TAG

似乎符合要求,因为即使单行具有 1 值,也将克服其他行中的所有 0s。

【讨论】:

  • 除了强制转换为 int,您还可以将 0 添加到 bit 以使其成为 int - MAX(Bool1+0)
  • 它起作用了,但结果变成了一个可以为空的位,事实并非如此!
  • 如果这是一个视图,并且您抱怨派生类型被标记为可空,请将适当的表达式包装在 ISNULL() 表达式中 - 类似于 CAST(ISNULL(MAX(CAST(Bool1 as int)),0) as bit)
  • 实际上它是这样工作的:ISNULL(CAST(MAX(CAST(Bool1 as int)) as bit),0),谢谢。
【解决方案2】:

请注意,MAX 运算符不适用于 BIT 字段。你必须CAST你的字段,以防它的类型不是INT才能使用@Damien_The_Unbeliever提出的解决方案

追加我假设一个简单的 1/0 值的字段可能有点

【讨论】:

  • 是的,它是一个位值,我试图在重复字段之间获取“OR”子句
  • 完美,@Damien_The_Unbeliever 解决方案只需简单修改即可正常工作:SELECT TAG,MAX( CAST (Bool1 AS INT )) as Bool1, MAX( CAST (Bool2 as INT)) as Bool2,MAX( CAST( Bool3 as INT)) as Bool3 from Table group by TAG
  • 已更新。谢谢。这很烦人,因为在很多地方,bit 被描述为 numeric 类型,因此 MAX() 很容易被很好地定义。
  • 无论如何,不​​错的解决方案和不错的重新转换为 BIT。
猜你喜欢
  • 2012-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-11
  • 2018-09-06
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多