[英]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_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
为tinyint(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
没有case
或coalesce
语句的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.