MySQL在case语句中保留类型
我有一个字段,它会根据某些输入进行更改:MySQL在case语句中保留类型,mysql,Mysql,我有一个字段,它会根据某些输入进行更改: SELECT CASE input WHEN 1 THEN id WHEN 2 THEN created_at WHEN 3 THEN some_varchar_field END as test FROM ... ORDER BY 1 ASC; 如果我按此字段排序,任何数字字段都没有正确排序,我注意到order by并没有保留所选字段的类型,而是,只要有VARCHAR/DATETIME字段,它就会
SELECT
CASE input
WHEN 1 THEN id
WHEN 2 THEN created_at
WHEN 3 THEN some_varchar_field
END as test
FROM ...
ORDER BY 1 ASC;
如果我按此字段排序,任何数字字段都没有正确排序,我注意到order by并没有保留所选字段的类型,而是,只要有VARCHAR/DATETIME字段,它就会返回该类型,而不是保留列本身的类型。我只是想知道是否有办法保留所选记录的类型
编辑:作为intCAST的强制转换字段(id为int)
不起作用
按顺序排列case语句也不起作用。我认为在这个解决方案中,虽然不美观,但应该会起作用 按顺序为每个字段创建一个新列
SELECT CASE 1
WHEN 1 THEN id
WHEN 2 THEN created_at
WHEN 3 THEN scomment
END as field_name
FROM (
SELECT I.id, I.rid,
C.created_at, C.rcreated_at,
S.scomment, S.rscomment
FROM (
SELECT t.id,
@rowid := @rowid + 1 AS rid
FROM test t,
(SELECT @rowid := 0) r
ORDER BY t.id
) I -- add sort column for id
JOIN (
SELECT t.id, created_at,
@rowcreated_at := @rowcreated_at + 1 AS rcreated_at
FROM test t,
(SELECT @rowcreated_at := 0) r
ORDER BY t.created_at
) C -- add sort column for created_at
ON I.id = C.id
JOIN (
SELECT t.id, scomment,
@rowscomment := @rowscomment + 1 AS rscomment
FROM test t,
(SELECT @rowscomment := 0) r
ORDER BY t.scomment
) S -- add sort column for scomment
ON I.id = S.id
) T
ORDER BY CASE 1
WHEN 1 THEN rid
WHEN 2 THEN rcreated_at
WHEN 3 THEN rscomment
END
所以,经过更多的研究和测试,我找到了一种方法,一点“清洁”
SELECT id, created_at, scomment
FROM test
ORDER BY
CASE 1 WHEN 1 THEN id END ASC,
CASE 1 WHEN 2 THEN created_at END ASC,
CASE 1 WHEN 3 THEN scomment END ASC;
这将允许我在特定字段上正确排序。
您甚至可以通过执行以下操作添加不同的方向:
SELECT id, created_at, scomment
FROM test
ORDER BY
CASE p_order_by WHEN 1 THEN AND p_dir = 'asc' id END ASC,
CASE p_order_by WHEN 1 THEN AND p_dir = 'desc' id END DESC,
CASE p_order_by WHEN 2 THEN AND p_dir = 'asc' created_at END ASC,
CASE p_order_by WHEN 2 THEN AND p_dir = 'desc' created_at END DESC,
CASE p_order_by WHEN 3 THEN AND p_dir = 'asc' scomment END ASC,
CASE p_order_by WHEN 3 THEN AND p_dir = 'desc' scomment END DESC;
其中p_order_by是您要排序的数字字段,p_dir是方向。您说查询有效吗?但是返回不同的数据类型?因为您通常不能使用不同数据类型的
案例。但是这是MySQL,所以允许这些奇怪的东西也就不足为奇了,查询本身可以工作,但它不能正确排序。是的,mysql做了一些奇怪的事情。你能在sqlFiddle上准备一个工作示例吗?我以前从未使用过sqlFiddle,所以我不确定这是否有效。我不认为您不能保留该类型,看起来mySQL将所有内容转换为更通用的类型,以保存本例中的每个数据类型varchar
。但是如果你想对结果进行排序,也许你可以使用用户变量。这是你想解决这个问题的东西,或者你需要数据类型?我包括小提琴