|
Программирование >> Преобразование значений null
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),#,)
Обработка значений 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |