选择在单个MySQL查询中的多个查询之间运行哪个查询

时间:2017-01-03 11:45:18

标签: mysql sql

我有一个查询,其中包含3个查询。 根据一个查询的结果,我想运行其他两个查询中的任何一个。

SELECT 

CASE type


    WHEN 'H'
     THEN (select count(*) from tableN where hid = 228)

    when 'S'
     THEN (  select cid,cname from tableC where cid = (select hid from tableN where sid = 228)  )


END

FROM tableC WHERE cid=228;

但是,因为其中一个查询只返回1列,即count(*),而另一个查询返回2列,即cid和cname ,我得到以下内容错误:

操作数应包含1列

如何修改我的查询以便-----

当type为'H'时,运行以下查询:

select count(*) from tableN where hid = 228

当type为'S'时,运行以下查询:

select cid,cname from tableC where cid = (select hid from tableN where sid = 228)

1 个答案:

答案 0 :(得分:0)

在解决这个问题之前,你需要考虑一些事情。

  1. 主查询的SELECT部分​​中的子查询必须始终返回单行,单列。
  2. 查询输出应始终给出一致的否。列作为输出。
  3. 例如:

    不正确:select col1, (select col2, col3 from...) , col 4 from table 1

    Coreect:select col1, (select col2 from..), (select col3 from..), col4 from table 1

    考虑到这两个限制,您的问题的解决方案可能是

    SELECT col1, col2 FROM
      (
        SELECT COUNT(*) AS col1, null AS col2, 'H' AS colType from tableN
        UNION ALL
        SELECT CID AS col1, CNAME AS col2, 'S' AS colType FROM tableC where .....
      )
    where colType = :input_type
    

    现在,根据input_type的值,选择查询1的结果或选择查询2。 注意:

    • 查询1将有一个虚拟列,以匹配任何行。
    • input_type是' H'或者' S'基于哪个是由您提供的变量
    • 查询2不完整,因为我想显示结构,而不是花时间查看完整的详细信息。
    • 此外,即使您只想要1个查询的结果,此查询也有执行这两个查询的风险
    • 建议将您选择执行哪个查询的逻辑移到过程块或应用程序层。使用SQL来决定在运行时执行哪个查询并不是一个好的设计。应用程序层逻辑是正确的(假设有一些其他程序调用此查询,你应该考虑在那里使用这个逻辑)