MySQL按大小写顺序将Tinyint转换为字符串

MySQL按大小写顺序将Tinyint转换为字符串,mysql,sql-order-by,case,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_o

我有以下疑问:

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
我已尝试将
显示顺序
强制转换为
未签名

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),无符号,允许为
display\u order

编辑

下面是描述数据元素值的

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)  
我能做些什么来纠正这个问题吗?

如以下所述:

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

由于
列是字符串类型,因此必须
单独转换
列,或者转换整个
大小写
表达式,才能获得所需的结果。在这种情况下,也比
案例
更简洁:

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

您可以使用一个简单的
orderby
,而不使用
case
coalesce
语句,这样就可以正常工作

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

描述数据元素值的输出是什么?你能给出你的表格示例吗?用同样的方法测试一个解决方案会很有趣rows@cegfault我添加了describeupdate——这就像一种魅力(某种程度上)。它不是在
value
列上排序,而是在display\u order列上排序。@GreenChili:对于那些
display\u order为NULL的记录,应该使用
value
。。。那不是你想要的吗?您的意思是先按
显示顺序
排序,然后在具有匹配的
显示顺序
的记录中,按
排序吗?如果是这样,您只需要按显示顺序排序,`value`
。不一定先按显示顺序排序,然后按值排序。如果display\u order不为null,我希望按display\u order排序,如果display\u order为null,则按value(可以是任何字符串值)排序。看看WonderCricket的回复,现在看看你的评论。看起来只需一个简单的“按显示顺序,值”就可以了。@GreenChili:假设您有以下
(显示id,值)
记录-
(1,1)、(1,3)、(2,1)、(NULL,2)
;它们应该以什么顺序返回?如果我有以下(id,显示顺序,值)记录-(1,1,'b'),(2,2,'a'),(3,null,'b'),(4,null,'a')。它将返回(通过id):1、2、4、3您正在对OP的预期业务逻辑进行假设,这在问题中没有给出。然而,考虑到这一点,这可能确实是人们实际寻求的。