多级 "where" 子句(类似于 order by)

Multi-level "where" clause (similar to order by)

鉴于以下英雄table:

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

我希望能够查询如下:

查询示例:

(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 来做到这一点吗(最好没有很多连接和查询)

是这样的吗?

... 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

如果 ID_NUMBER 匹配,return 那一行。

(或者)如果 driverLicenseNumber 匹配,return 如果 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))

您可以使用 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)