2016-03-30 4 views
0

У меня есть поле, которое меняется, основываясь на некоторых входных сигналов: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; 

Если бы я заказать на этом поле любое числовое поле не отсортированных должным образом, я заметил, что заказ на не сохраняет тип поля, которое было выбрано скорее, как только появится поле VARCHAR/DATETIME, оно вернет этот тип, а затем сохранит тип самого столбца. Мне просто интересно, есть ли способ сохранить тип выбранной записи.

Редактировать: Поле для литья в виде int CAST(id as INT) не работает Внесение оператора case в порядок не работает.

+0

Вы говорите, что запрос работает? Но верните другой тип данных? Потому что вы обычно не имеете «CASE» с разными типами данных. Но это MySQL, поэтому не удивительно, чтобы эти странные вещи –

+0

Да, сам запрос работает, но он не упорядочивает правильно. И да, mysql делает некоторые странные вещи. – RMT

+0

можете ли вы подготовить рабочий образец на sqlFiddle? –

ответ

0

Итак, после нескольких исследований и испытаний я смог найти способ сделать это, немного «чище».

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 направление.

0

Я думаю, что это решение, не очень, но должно работать.

SQL Fiddle Demo

Создать новый столбец для каждого из полей с порядком на нем.

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 
+0

Включая скрипку –