#sql #oracle #oracle11g
#sql #Oracle #oracle11g
Вопрос:
SELECT * FROM
(
SELECT city from addr_tab
UNION ALL
SELECT 'zzzz' AS city from dual
)ORDER BY city
Я использую описанный выше подход для извлечения ‘zzzz’ в качестве последней записи таблицы. Но я не думаю, что это будет работать постоянно, поскольку город теоретически может быть чем-то большим, чем «zzzz» в алфавитном порядке. Существует ли какой-либо другой надежный подход для получения этой закодированной записи в качестве последней записи?. Мне это нужно для создания отчетов с использованием oracle reports. Любая помощь была бы очень кстати.
Комментарии:
1. Это тот вид взлома, который в прошлом вызывал проблемы, подобные проблеме Y2K. Не делайте этого! Если это не настоящий город, не помещайте эти данные в эту таблицу — переместите их куда-нибудь еще. Либо в другую таблицу, возможно, специально созданную для этих данных, либо вообще за пределами базы данных. Или, может быть, город не должен быть столбцом этой таблицы.
2. @Robin Green: Спасибо за комментарий. Я понимаю ваше беспокойство. Колонка «Город» была использована просто в качестве примера. Я использую это для отчетности, как я уже указал в вопросе. К сожалению, у меня нет контроля над моделью данных, поскольку она уже была создана кем-то другим. Я хотел бы что-нибудь сделать (переделать макет или что-то в этом роде) в отчетах, но что за хак, я мог бы просто использовать быстрое и грязное решение для этого. 😉
Ответ №1:
Добавьте еще один виртуальный столбец (order_col), который будет использоваться для упорядочивания. Запрос в конечном итоге будет выглядеть следующим образом.
SELECT * FROM
(
SELECT city, 1 as order_col from addr_tab
UNION ALL
SELECT 'zzzz', 2 as order_col AS city from dual
)ORDER BY order_col, city
Таким образом, вы можете гарантировать, что ‘zzzz’ всегда будет последним, поскольку в основном столбце упорядочения (order_col) для ‘zzzz’ гарантировано меньшее значение, чем для всех остальных записей.
Ответ №2:
Что ж, как говорили другие (в комментарии и ответе), вероятно, есть лучший способ подойти к проблеме с самого начала; но если вам нужен временный взлом, читайте дальше !…
Назовите последнюю запись как хотите …
‘zzzz’ подойдет…
и затем используйте пользовательский ORDER BY
, подобный:
SELECT *
FROM (
SELECT city
FROM addr_tab
UNION ALL
SELECT 'zzzz' AS city
FROM dual
)
ORDER BY
CASE WHEN city = 'zzzz' THEN 1 ELSE 0 END,
city;
Комментарии:
1. Спасибо Адаму Бернье. Это может сработать только для текущей задачи.
Ответ №3:
это также можно решить следующим запросом
SELECT * FROM
( SELECT city from addr_tab order by city)
UNION ALL
SELECT 'zzzz' from dual;
теперь есть еще один стиль для этого
with
b1 as
(
SELECT city from addr_tab order by city
)
select city from b1
union all
SELECT 'zzzz' from dual;
итак, вы можете использовать любую….