首页 > 解决方案 > 获取存在特定值的行,如果不存在则显示具有其他值的行

问题描述

我有一个条件,当用户更改他的邮件 ID 时,状态列的值会更改为 100。如果邮件 ID 未更改,则状态列中的值将为 10。用户的 ID 始终相同。

ID      MAIL            Status
10248   xyz@xyz.com      10
10248   xyz1@xyz.com     100
10241   abc@abc.com      10
10249   pqr@pqr.com      10
10249   pqr1@pqr.com     100
10250   kbc@kbc.com      10
10251   axc@axc.com      10

因此,如果邮件 ID 已更改,则从此获取具有新邮件 ID 的行。就像如果某个 id 存在状态 100,则显示该 id 的行并且不显示该 id 的状态 10 行。如果 id 没有状态 100,则显示状态为 10 的行。

我试过了,但它返回了一个 id 的状态。

SELECT id, mail, IF(status=100, status=100,status=10)
FROM table1;

因此,对于 ID 10248 和 10249,我希望只有状态为 100 的行。

标签: mysqlsql

解决方案


据我了解,这就是您要执行的操作:

  • 如果用户有一行status code = 100,则返回该行
  • 否则,返回行status code = 10

如果您的版本 (8.0+) 支持窗口函数,您可以执行以下操作:

SELECT id, mail
FROM (
  SELECT id, mail, 
    ROW_NUMBER() OVER(
      PARTITION BY id ORDER BY 
        CASE status 
          WHEN 100 THEN 0 -- Give status = 100 first priority
          WHEN 10 THEN 1 -- Give status = 10 second priority
          ELSE 2 -- Give anything else last priority
        END
    ) AS RowNum
  FROM table1
) src
WHERE RowNum = 1

推荐阅读