Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在case语句中保留类型_Mysql - Fatal编程技术网

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字段,它就会返回该类型,而不是保留列本身的类型。我只是想知道是否有办法保留所选记录的类型

编辑:作为int
CAST的强制转换字段(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
。但是如果你想对结果进行排序,也许你可以使用用户变量。这是你想解决这个问题的东西,或者你需要数据类型?我包括小提琴