C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
сортировка в sql и NULL
telepath
Отправлено: 29.12.2004, 13:25


Станционный диспетчер

Группа: Участник
Сообщений: 132



Не подскажете как отсортировать такую табличку правильно
не по id и не по Name

id — n1  — n2  — n3  — n4  — n5  — Name это поля
-------------------------------------------------
1  — 1  — null  — null — null — null — rec1 это данные
2  — 1  — 1  — null — null — null — rec2

запрос типа:
CODE
select * from table order by n1,n2,n3,n4,n5

выставляет записи таким образом:

2 — 1 — 1  — null — null — null — rec2
1 — 1 — null — null — null — null — rec1
AVC
Отправлено: 29.12.2004, 14:27


Ветеран

Группа: Модератор
Сообщений: 1583



Что значит правильно?
То что делает сервер и есть правильно. А если проблемы с null то можно
использовать:
функцию преобразования null к чему-то
или
поискать установку параметра сортировки — null вперед/назад
или
сделать конкатенацию полей (функцию над полями) и сортировать по результату
telepath
Отправлено: 29.12.2004, 14:30


Станционный диспетчер

Группа: Участник
Сообщений: 132



А где примерно искать опцию null вперед/назад ?
AVC
Отправлено: 29.12.2004, 14:35


Ветеран

Группа: Модератор
Сообщений: 1583



В документации по серверу smile.gif Кстати по какому?
Может поискать футкцию типа IsNull (), NVL() ...
telepath
Отправлено: 29.12.2004, 15:05


Станционный диспетчер

Группа: Участник
Сообщений: 132



Firebird, работаю через FIB
avc*
Отправлено: 29.12.2004, 15:30


Не зарегистрирован







Мне кажется FB в базовом комплекте установок нет, функция типа IsNull есть, только имеет какое то странное название — ни как не вспомню какое.
Вот еще нашел у себя на диске
QUOTE

SQL Language Extension: ORDER BY clause can specify expressions and nulls placement

Syntax
========

SELECT ... FROM .... ORDER BY order_list ....;

order_list : order_item [, order_list];

order_item : [order_direction] [nulls_placement]

order_direction : ASC | DESC;

nulls_placement : NULLS FIRST | NULLS LAST;

  The ORDER BY clause lets you specify any valid expressions to
  sort query results. If expression is consisted of a single number
  it is interpreted as column number. The nulls_placement clause
  controls ordering of nulls in result set. They can be sorted
  either above (NULLS FIRST) or below (NULLS LAST) of all other values.
  Behaviour when nulls_placement is unspecified is NULLS LAST.  

Author:
  Nickolay Samofatov


N O T E S
=========

- Index is never used for ordering if you specify NULLS FIRST
  as a nulls_placement
- Results are undefined if you ask engine to sort results using
  non-deterministic UDF or stored procedure.
- Amount of procedure invocations is undefined if you ask engine to
  sort results using UDF or stored procedure in any case even
  if you reference column calling procedure by number
- You can use only numbers to reference columns to sort unions

Examples
========


A)
 SELECT * FROM MSG
 ORDER BY PROCESS_TIME DESC NULLS FIRST

cool.gif
 SELECT FIRST 10 * FROM DOCUMENT
 ORDER BY STRLEN(DESCRIPTION) DESC

C)
 SELECT DOC_NUMBER, DOC_DATE FROM PAYORDER
 UNION ALL
 SELECT DOC_NUMBER, DOC_DATA FROM BUDGORDER
 ORDER BY 2 DESC NULLS LAST, 1 ASC NULLS FIRST
telepath
Отправлено: 29.12.2004, 15:38


Станционный диспетчер

Группа: Участник
Сообщений: 132



Огромное спасибо asc nulls first помогло smile.gif

Отредактировано telepath — 29/12/2004, 16:40

Вернуться в Работа с базами данных в C++Builder