我有以下查询:
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)
我能做些什么来纠正这个问题吗?
答案 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
而不使用case
或coalesce
语句,它可以正常使用。
SELECT
id,
display_order
FROM
data_element_value
WHERE
key_id = 32
ORDER BY `display_order`, `value`