Как вызвать запрос, чтобы переместить местоположение строки в Last? - PullRequest
0 голосов
/ 07 января 2020

Можно ли в любом случае переместить указанное c местоположение строки в последний ряд, не меняя расположение других строк? В настоящее время я использую CASE WHEN STATEMENT, он может перемещаться в последнюю строку, но расположение других строк также изменяется. Это демонстрационная база данных

    | 1 | John |
    | 2 | Mark |
    | 3 | Matt |
    | 4 | Zin  |
    | 5 | Teju |
    | 6 | Yolo |

Запрос SELECT * FROM Transaction_table ORDER BY (CASE WHEN name = 'John' THEN 6 END), name. Результат становится таким:

    | 1 | Yolo |
    | 2 | Mark |
    | 3 | Zin  |
    | 4 | Matt |
    | 5 | Teju |
    | 6 | John |

Я просто хочу, чтобы остальные строки остались нетронутыми.

Ответы [ 2 ]

1 голос
/ 07 января 2020

Я полагаю, что вы можете использовать что-то вроде: -

WITH namecte AS (SELECT 'Teju') /*<<<<<<<<<< change name to required name to appear last */
SELECT 
    (SELECT max(rowid) FROM transaction_table) + 1 AS sortid,
    *,
    rowid AS original_rowid 
    FROM transaction_table 
    WHERE name = (SELECT * FROM namecte)
UNION SELECT 
    rowid AS sortid,
    *,
    rowid AS original_rowid 
    FROM transaction_table 
    WHERE name <> (SELECT * FROM namecte) 
    ORDER BY sortid
;

Это предполагает, что таблица не является таблицей БЕЗ ROWID и что порядок является порядком вставки и отсюда использование rowid (который создает сорт).

  • Конечно, вместо rowid можно использовать другой столбец, если такой столбец лучше обозначает то, что считается первым ..... последний (теоретически понятия не существует) порядка, если не используется ORDER BY) , хотя для генерации сортировки может потребоваться настройка для соответствия содержимому столбца.
  • original_rowid существует исключительно для демонстрации и, вероятно, будет опущен (хотя это может быть полезно поскольку это фактический идентификатор строки и может использоваться для определения местоположения строки, если требуется последующее сканирование)

Демо / тест

DROP TABLE IF EXISTS transaction_table;
CREATE TABLE IF NOT EXISTS transaction_table (name TEXT);
INSERT INTO transaction_table VALUES('John'),('Mark'),('Matt'),('Zin'),('Teju'),('Yolo');
WITH namecte AS (SELECT 'John')
SELECT 
    (SELECT max(rowid) FROM transaction_table) + 1 AS sortid,
    *,
    rowid AS original_rowid 
    FROM transaction_table 
    WHERE name = (SELECT * FROM namecte)
UNION SELECT 
    rowid AS sortid,
    *,
    rowid AS original_rowid 
    FROM transaction_table 
    WHERE name <> (SELECT * FROM namecte) 
    ORDER BY sortid
;
/* Cleanup Testing Environment */
DROP TABLE IF EXISTS transaction_table;

enter image description here

Изменение на Zin: -

enter image description here

1 голос
/ 07 января 2020

Если вы хотите, чтобы John был последним, а остальные упорядочены по имени, используйте две клавиши, но вот так:

order by (case when name = 'John' then 2 else 1 end),  -- put John last
         name

Однако ваши исходные строки не отсортированы по name , Без order by набор результатов будет неупорядоченным , и тот же запрос может возвращать строки в любом произвольном порядке.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...