【问题标题】:What is the order of data comparison in the database for SELECT by column A OR column BSELECT by column A OR column B的数据库中数据比较的顺序是什么
【发布时间】:2018-01-07 15:13:33
【问题描述】:

我有一个查询,我需要通过 1) 通过 old_email 比较来获取一行,如果没有找到则 2) 通过比较电子邮件列。 我需要确保第一次检查总是通过电子邮件,第二次检查是通过 strong> 如果没有找到旧的,请发送电子邮件。

我知道我不能使用 set,因为无法保证比较顺序,例如

SELECT * FROM champions WHERE (email IN ('old@example.com', 'new@example.com'))

以下代码能否满足我的需求:

SELECT * FROM champions WHERE (email = 'old@example.com' OR email = 'new@example.com')

【问题讨论】:

  • 如果您想要电子邮件是旧电子邮件或新电子邮件的行,为什么比较顺序很重要?两个查询都应该可以正常工作。
  • 如果eMail ID都在同一列下,你将如何区分它们是旧的还是新的(更新的)?
  • @slaasko OP 所指的顺序是行顺序(不是谓词部分的评估顺序)。因为如果没有找到第一个电子邮件地址的记录,OP 只想搜索第二个电子邮件地址。 (换句话说,OP 目前不确定如何在 SQL 中表达这样的要求。)
  • @slaakso:同一个用户注册了两次,第一次是在 user+test@example.com,第二次是在 user@example.com。对于我的具体情况,我想确保始终满足初始情况。

标签: mysql sql select comparison


【解决方案1】:

逐行应用WHERE 子句。一行的结果不知道另一行的结果。


您似乎在描述的是“查找电子邮件地址 X,如果找不到则查找电子邮件地址 Y”。

有几种方法可以做到这一点。例如,以下是对您所描述的内容的一种非常直截了当的方法...

SELECT
  *
FROM
  champions
WHERE
  email = 'new@example.com'

UNION ALL

SELECT
  *
FROM
  champions
WHERE
  email = 'old@example.com'
  AND NOT EXISTS (SELECT * FROM champions WHERE email = 'new@example.com')

确实如您所描述的那样。查找电子邮件地址 X。在电子邮件地址 X 不存在的情况下,还要查找电子邮件地址 Y。


虽然这很冗长,但您最终会检查 'X' 两次...最好以更基于集合的方式思考。

  1. 查找电子邮件地址为 X 或 Y 的记录
  2. 对它们进行排序,使电子邮件地址为 X 的记录排在第一位
  3. 只选择第一条记录

例如...

SELECT
  *
FROM
  champions
WHERE
  email IN ('old@example.com', 'new@example.com')
ORDER BY
  CASE WHEN email = 'new@example.com' THEN 1 ELSE 2 END
LIMIT
  1

【讨论】:

  • 非常感谢@MatBailie。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2022-08-03
相关资源
最近更新 更多