繁体   English   中英

MySQL按案例顺序将Tinyint转换为字符串

[英]MySQL Order By Case Casting Tinyint to String

我有以下查询:

SELECT
    id,
    display_order
FROM 
    data_element_value
WHERE 
       key_id = 32
ORDER BY 
    CASE WHEN (display_order IS NOT NULL) THEN 
        display_order
    ELSE 
        `value` 
    END

预期的产出是:

id                    display_order
1                     1
13                    2
15                    3
16                    10

但是,我得到了:

id                    display_order
1                     1
16                    10
13                    2
15                    3

我已经尝试将display_orderUNSIGNED

CASE WHEN (display_order IS NOT NULL) THEN
    CAST(display_order as UNSIGNED)
ELSE
    `VALUE`
END

我也尝试过:

CASE WHEN (display_order IS NOT NULL) THEN
    display_order + 0
ELSE
    `VALUE`
END

但这似乎没有帮助。

列数据类型为tinyint(2), unsigned, and allow nulls display_ordertinyint(2), unsigned, and allow nulls

编辑

这是describe data_element_value

Field           Type                Null    Key Default Extra
id              int(11)             NO      PRI (null)  auto_increment
key_id          int(11)             NO      MUL (null)  
value           varchar(50)         NO          (null)  
sub_title       varchar(125)        YES         (null)  
chart_color     char(7)             YES         (null)  
display_order   tinyint(2) unsigned YES         (null)  

我能做些什么来纠正这个问题吗?

CASE

CASE表达式的返回类型是所有返回值的兼容聚合类型,但也取决于使用它的上下文。 如果在字符串上下文中使用,则结果将作为字符串返回。 如果在数字上下文中使用,则结果将返回为十进制,实数或整数值。

由于您的value列是一个字符串类型,你将不得不CAST要么value单独列,否则整个CASE表达式,以达到您想要的结果。 在这种情况下, COALESCE()也比CASE更简洁:

SELECT
    id,
    display_order
FROM 
    data_element_value
WHERE 
    key_id = 32
ORDER BY 
    COALESCE(display_order, CAST(`value` AS UNSIGNED))

您可以order by没有casecoalesce语句的case使用简单的order by ,它可以正常工作。

SELECT
    id,
    display_order
FROM 
    data_element_value
WHERE 
       key_id = 32
ORDER BY `display_order`, `value`

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM