多级 "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,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 来做到这一点吗(最好没有很多连接和查询)
是这样的吗?
... 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 all
和 not 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)
鉴于以下英雄table:
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 来做到这一点吗(最好没有很多连接和查询)
是这样的吗?
... 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 all
和 not 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)