我见过很多例子,但似乎没有人能把我带到我需要的地方。 我想从表A中选择1个字段,然后检查表B中的值,如果该值为真(布尔值),则还从表A中选择字段2和3以返回所有3个字段。因此,如果来自B的值为假,则从表A中仅选择1个字段,如果为真,则选择所有3个字段。
答案 0 :(得分:1)
Select Field1
, Case
When Exists (
Select 1
From TableB
Where SomeField = 1
And ...
) Then TableA.Field2
Else Null
End As Field2
, Case
When Exists (
Select 1
From TableB
Where SomeField = 1
And ...
) Then TableA.Field3
Else Null
End As Field3
From TableA
<强>更新强>
如果您想要的是每列三列结果,即使其中一些列为空,上述解决方案也能正常工作。但是,如果您想要的是基于查询返回的不同数量的列,那么这是在单个查询中无法完成的。 SQL语言不适合处理即时模式生成。我的建议首先是评估为什么你想从同一个查询中获得不同数量的列,并确定你是否不能简单地处理第2列或第3列为NULL的中间层中的场景。这是迄今为止最简单的解决方案,可以在一个查询中完成:
Select TableA.Field1, TableA.Field2, TableA.Field3
, (
Select TableB.SomeBooleanColumn
From TableB
) As TableBValue
From TableA
然后,您的中间层代码将确定是否对Field2和Field3执行某些操作。
也就是说,如果你坚持使用两个列结构,则需要两个查询:
Select TableA.Field1
From TableA
Where Exists (
Select 1
From TableB
Where TableB.SomeColumn = 0
)
调用此查询后,您将评估是否有一行。如果没有行,则可以调用此查询:
Select TableA.Field1, TableA.Field2, TableA.Field3
From TableA
Where Exists (
Select 1
From TableB
Where TableB.SomeColumn = 1
)
OP中没有说明的是表B中没有行的情况。
答案 1 :(得分:0)
用例表达式:
select A.field1,
case B.boolValue when 1 then A.field2 end AS field2,
case B.boolValue when 1 then A.field3 end AS field3
from TableA A join TableB B on A.? = B.?
我不知道你的A和B表是什么链接的,所以你必须填写?分数。当B.boolValue为false时,这将返回field2和field3的空值。