【问题标题】:Compare enum indexes of two SQL entries比较两个 SQL 条目的枚举索引
【发布时间】:2014-11-11 16:04:48
【问题描述】:

我需要比较两个不同表中两个相似列的两个枚举值的索引。枚举值是New, Reviewed, Design, Production,在我们的流程中是按照状态升序排列的,所以根据New == 1Reviewed==2等思路做比较应该还是比较容易的……

我目前正在尝试:

SELECT CASE WHEN table1.review_status < table2.review_status THEN table1.review_status
            WHEN table2.review_status < table1.review_status THEN table2.review_status
            END

这似乎是对字符串NEWREVIEW 等进行字母比较...我需要它来比较索引,而不是值。这可能吗?

【问题讨论】:

  • 您使用的是哪个数据库?

标签: mysql sql enums


【解决方案1】:

在枚举值上加 0 以将其转换为数字进行数值比较。

https://dev.mysql.com/doc/refman/5.7/en/enum.html

create table table1 (
  id int,
  review_status enum('New', 'Reviewed', 'Design', 'Production')
);
insert into table1 values
(1, 'New'), (2, 'Production'), (3, 'Design'), (4, 'Reviewed');

create table table2 (
  id int,
  review_status enum('New', 'Reviewed', 'Design', 'Production')
);
insert into table2 values
(1, 'Design'), (2, 'New'), (3, 'Reviewed'), (4, 'Reviewed');

select table1.id, table1.review_status s1, table2.review_status s2,
  CASE WHEN table1.review_status+0 < table2.review_status THEN table1.review_status
       WHEN table2.review_status+0 < table1.review_status THEN table2.review_status
  END
from table1
join table2 on table2.id = table1.id;

http://www.sqlfiddle.com/#!2/906529/4

【讨论】:

    【解决方案2】:

    创建一个新表。称之为 ReviewStatusDefinitions。该表将有两列:StatusName 和 StatusOrder。 StatusName 列将具有“New”、“Reviewed”等值,而 StatusOrder 列将具有相应的数值 1、2 等。现在您可以加入此表并将 StatusOrder 列用于您的 CASE。

    【讨论】:

    • 这听起来像是一个合法的答案,但我对 MySQL 很陌生。你能不能再细分一下?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    • 2012-05-04
    相关资源
    最近更新 更多