Oracle SQL — наконец-то извлекаю запись

#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;
  

итак, вы можете использовать любую….