Случай, Когда Затем Соседний Сценарий переключения Соответствует идентификатору

#mysql #sql

Вопрос:

Давайте предположим

«Мэри-учительница в средней школе, и у нее есть место за столом, где хранятся имена учеников и их соответствующие удостоверения личности. Идентификатор столбца является непрерывным приращением. Мэри хочет пересесть на соседние места для студентов.’

Примерная таблица выглядит следующим образом:

  --------- --------- 
|    id   | student |
 --------- --------- 
|    1    | Doris   |
|    2    | Abbot   |
|    3    | Green   |
|    4    | Emerson |
|    5    | Jeames  |
 --------- --------- 
 

Мэри хочет переключить соседнего ученика, результат выглядит так:

  --------- --------- 
|    id   | student |
 --------- --------- 
|    1    | Abbot   |
|    2    | Doris   |
|    3    | Emerson |
|    4    | Green   |
|    5    | Jeames  |
 --------- --------- 
 

Я придумал решение, используя оператор Case When и Then.

Решение :

 SELECT 
    CASE 
        WHEN((SELECT MAX(id) FROM seat)%2 = 1) AND id = (SELECT MAX(id) FROM seat) THEN id
        WHEN id%2 = 1 THEN id   1
        ELSE id - 1
    END AS id, student
FROM seat
ORDER BY id
 

Существует ли какой-либо другой простой способ, используя утверждение случая или любой другой подход, с помощью которого мы можем решить эту проблему.

Спасибо

Комментарии:

1. из формулировки проблемы следует, что вы должны обновлять, а не выбирать?

Ответ №1:

Вы можете использовать комбинацию самостоятельного соединения с помощью LEFT JOIN CASE WHEN и COALESCE в качестве альтернативы.

 select s1.id, coalesce(s2.student,s1.student)
from sample s1
  left join sample s2
    on s1.id   case when s1.id%2=1 then 1 else -1 end = s2.id
 

введите описание изображения здесь

COALESCE и LEFT JOIN просто необходимы для ведения учета Jeames , которые не объединяются с s2

Вы можете протестировать эту скрипку db<>.

Ответ №2:

Вы можете использовать lead() и first_value() :

 select id,
       coalesce(lead(student) over (order by id),
                first_value(student) over (order by id)
               ) as student
from t;