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

时间:2015-03-04 16:25:17

标签: mysql sql-order-by case

我有以下查询:

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_order转换为UNSIGNED

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_order

修改

以下是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)  

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

2 个答案:

答案 0 :(得分:2)

正如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))

答案 1 :(得分:1)

您可以使用简单的order by而不使用casecoalesce语句,它可以正常使用。

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