Программирование >>  Преобразование значений null 

1 ... 11 12 13 [ 14 ] 15 16 17 ... 219


WARD 30 JONES 20 MARTIN 30 BLAKE 30 CLARK 10 SCOTT 20 KING 10 TURNER 30 ADAMS 20 JAMES 30 FORD 20 MILLER 10

Требуется сортировать результаты по DEPTNO или ENAME. Сортировка по DEPTNO обеспечивает следующее результирующее множество:

DATA

CLARK 10 KING 10 MILLER 10 SMITH 20 ADAMS 20 FORD 20 SCOTT 20 JONES 20 ALLEN 30 BLAKE 30 MARTIN 30 JAMES 30 TURNER 30 WARD 30

Сортировка по ENAME обеспечивает следующее результирующее множество:

DATA

ADAMS 20 ALLEN 30 BLAKE 30 CLARK 10 FORD 20 JAMES 30 JONES 20 KING 10 MARTIN 30 MILLER 10 SCOTT 20 SMITH 20 TURNER 30 WARD 30



Решение

Oracle и PostgreSQL

Вносим коррективы в строку, подлежащую сортировке, с помощью функций REPLACE (заместить) и TRANSLATE (переместить):

/* СОРТИРУЕМ ПО DEPTNO */

1 select data

2 from V

3 order by replace(data,

4 replace(

5 translate(data,0123456789,##########),#,),)

/* СОРТИРУЕМ ПО ENAME */

1 select data

2 from emp

3 order by replace(

4 translate(data,0123456789,##########),#,) DB2

В DB2 неявное преобразование типов более строгое, чем в Oracle или PostgreSQL, поэтому чтобы представление V было корректным, необходимо привести DEPTNO к типу CHAR. В этом решении мы не будем повторно создавать V, а просто используем вложенный запрос. Функции REPLACE и TRANSLATE используются аналогично тому, как это делалось в решении для Oracle и PostrgreSQL, но в данном случае порядок аргументов TRANSLATE немного другой:

/* СОРТИРУЕМ ПО DEPTNO */

1 select *

2 from (

3 select ename cast(deptno as char(2)) as data

4 from emp

5 ) v

6 order by replace(data,

7 replace(

8 translate(data,##########,0123456789),#, ), ) /* СОРТИРУЕМ ПО ENAME */

1 select *

2 from (

3 select ename cast(deptno as char(2)) as data

4 from emp

5 ) v

6 order by replace(

7 translate(data,##########,0123456789),#,)



DATA

NUMS

CHARS

SMITH 20

SMITH

ALLEN 30

ALLEN

WARD 30

WARD

JONES 20

JONES

MARTIN 30

MARTIN

BLAKE 30

BLAKE

CLARK 10

CLARK

SCOTT 20

SCOTT

KING 10

KING

TURNER 30

TURNER

ADAMS 20

ADAMS

JAMES 30

JAMES

FORD 20

FORD

MILLER 10

MILLER

Обработка значений NULL при сортировке Задача

Требуется сортировать выборку из таблицы EMP по столбцу COMM, но это поле может содержать NULL значения. Необходим способ задания, указывающий, где в результате сортировки должны располагаться NULL значения - после строк с определенными значениями:

ENAME SAL COMM

TURNER 1500

MySQL и SQL Server

В настоящее время данные платформы не поддерживают функцию TRANSLATE, таким образом, решения для этой задачи нет.

Обсуждение

Функции TRANSLATE и REPLACE удаляют из каждой строки числа или символы соответственно, что обеспечивает возможность сортировки по данным одного или другого типа. Значения, переданные в ORDER BY, показаны в результатах следующего запроса (в качестве примера используется решение Oracle, поскольку аналогичная техника применима в продуктах всех трех производителей; решение DB2 отличается только порядком параметров, передаваемых в TRANSLATE):

select data,

replace(data, replace(

translate(data,0123456789,##########),#, ), nums, replace(

translate(data,0123456789,##########),#, ) chars from V



1 ... 11 12 13 [ 14 ] 15 16 17 ... 219

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика