根据另一个表中的值,在表中最多选择3个不同的字段?

时间:2011-11-16 01:03:13

标签: mysql

我见过很多例子,但似乎没有人能把我带到我需要的地方。 我想从表A中选择1个字段,然后检查表B中的值,如果该值为真(布尔值),则还从表A中选择字段2和3以返回所有3个字段。因此,如果来自B的值为假,则从表A中仅选择1个字段,如果为真,则选择所有3个字段。

2 个答案:

答案 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的空值。