【问题标题】:Multi-level "where" clause (similar to order by)多级“where”子句(类似于 order by)
【发布时间】:2020-12-02 08:32:40
【问题描述】:

鉴于以下英雄表:

firstName   |  lastName   | idNumber  | driverLicenseNumber
            |             |           |     
  Captain   |  America    |    1      |       10
  Spider    |  Man        |    2      |       20

我希望能够查询如下:

  • 给定 ID_NUMBER、DRIVER_LICENSE_NUMBER(参数)
  • 如果存在 idNumber=ID_NUMBER,则获取这些匹配项(并且仅获取它们)。
  • 否则。如果存在 driverLicenseNumber=DRIVER_LICENSE_NUMBER 则获取这些匹配项

查询示例:

(ID_NUMBER=1 , DRIVER_LICENSE_NUMBER=20) => [美国队长]

(ID_NUMBER=4 , DRIVER_LICENSE_NUMBER=20) => [蜘蛛侠]

(ID_NUMBER=4 , DRIVER_LICENSE_NUMBER=40) => []

我的尝试:

我正在获取与其中一个字段匹配的所有行:

Select * from Heroes where idNumber=ID_NUMBER or driverLicenseNumber=DRIVER_LICENSE_NUMBER;

比在我的代码 (nodeJS) 中迭代结果。

我可以只使用 mysql 来做到这一点吗(最好没有很多连接和查询)

【问题讨论】:

    标签: mysql sql subquery where-clause


    【解决方案1】:

    如果 ID_NUMBER 匹配,则返回该行。

    (或)如果 driverLicenseNumber 匹配,如果 ID_NUMBER 根本不存在,则返回该行。

    select * from Heroes
    where idNumber = ID_NUMBER 
      or (driverLicenseNumber = DRIVER_LICENSE_NUMBER
          and NOT EXISTS (select 1 from Heroes where idNumber = ID_NUMBER))
    

    【讨论】:

      【解决方案2】:

      像这样?

      ... WHERE idNumber = ID_NUMBER OR (idNumber != ID_NUMBER AND driverLicenseNumber = DRIVER_LICENSE_NUMBER)
      

      它获取设置了 ID_NUMBER 的所有行,以及仅设置了驾驶执照号码的所有行。

      如果您还可以获取两个 ID 都有效的行,只需使用 or

      ... WHERE idNumber = ID_NUMBER OR driverLicenseNumber = DRIVER_LICENSE_NUMBER
      

      【讨论】:

        【解决方案3】:

        您可以使用union allnot exists

        select *
        from heroes
        where idnumber = :id_number
        union all
        select *
        from heroes
        where 
            driverlicensenumber = :driverlicensenumber
            and not exists (select 1 from heroes where idnumber = :id_number)
        

        我希望这个解决方案表现良好,特别是如果您有以下索引:

        heroes(id_number)
        heroes(driverlicensenumber)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-07-06
          • 1970-01-01
          • 2016-06-12
          • 1970-01-01
          • 2012-05-31
          • 2012-03-16
          • 2012-12-24
          相关资源
          最近更新 更多