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

1 ... 46 47 48 [ 49 ] 50 51 52 ... 219


Это представление возвращает следующие данные:

DATA

CLARK

7782

ACCOUNTING

KING

7839

ACCOUNTING

MILLER

7934

ACCOUNTING

SMITH

7369

RESEARCH

JONES

7566

RESEARCH

SCOTT

7788

RESEARCH

ADAMS

7876

RESEARCH

FORD

7902

RESEARCH

ALLEN

7499

SALES

WARD

7521

SALES

MARTIN

7654

SALES

BLAKE

7698

SALES

TURNER

7844

SALES

JAMES

7900

SALES

Необходимо упорядочить результаты по номеру служащего, который располагается между именем служащего и названием соответствую-

щего отдела:

DATA

SMITH

7369

RESEARCH

ALLEN

7499

SALES

WARD

7521

SALES

JONES

7566

RESEARCH

MARTIN

7654

SALES

BLAKE

7698

SALES

CLARK

7782

ACCOUNTING

SCOTT

7788

RESEARCH

KING

7839

ACCOUNTING

TURNER

7844

SALES

ADAMS

7876

RESEARCH

JAMES

7900

SALES

FORD

7902

RESEARCH

MILLER

7934

ACCOUNTING

Решение

В каждом решении используются функции и синтаксис, характерные для той или иной СУБД, но методика (применение встроенных функций REPLACE и TRANSLATE) во всех случаях одна и та же. Суть в том, чтобы с помощью REPLACE и TRANSLATE удалить из строк символы, не являющиеся цифрами, оставив только числовые значения, по которым и провести сортировку.

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



Обсуждение

Единственное назначение представления V - предоставление строк для демонстрации решения данного рецепта. Это представление просто объединяет несколько столбцов таблицы EMP. В решениях показано, как сортировать такие объединенные текстовые данные по входящему в них номеру служащего.

1 select data

2 from V

3 order by

4 cast(

5 replace(

6 translate(data,repeat(#,length(data)),

7 replace(

8 translate(data,##########,0123456789),

9 #,)),#,) as integer)

Oracle

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

1 select data

2 from V

3 order by

4 to number(

5 replace(

6 translate(data,

7 replace(

8 translate(data,0123456789,##########),

9 #), rpad(#,20,#)),#))

PostgreSQL

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

1 select data

2 from V

3 order by

4 cast(

5 replace(

6 translate(data,

7 replace(

8 translate(data,0123456789,##########),

9 #,),rpad(#,20,#)),#,) as integer)

MySQL и SQL Server

На момент написания данной книги ни один из данных производителей не поддерживает функцию TRANSLATE.



Используемый в решениях оператор ORDER BY, возможно, выглядит немного устрашающе, но он прекрасно работает и становится довольно понятным, если разобрать его по частям. Чтобы провести сортировку по числам, входящим в строку, проще всего удалить из строки все символы, не являющиеся числами. Как только нечисловые символы будут удалены, останется лишь привести строку чисел к числовому типу данных и сортировать, как душе угодно. Прежде чем анализировать каждую функцию, важно понять порядок их вызова. Начиная с самого внутреннего вызова, функции TRANSLATE (строка 8 во всех решениях), мы видим, что:

1. Вызывается TRANSLATE (строка 8) и результаты возвращаются в

2. REPLACE (строка 7), результаты ее выполнения возвращаются в

3. TRANSLATE (строка 6), результаты ее выполнения возвращаются в

4. REPLACE (строка 5), результаты ее выполнения возвращаются и наконец-то

5. приводятся к числовому типу данных.

Первый шаг - преобразовать числа в символы, которых нет в строке. Для данного примера я выбрал символ # и использовал функцию TRANSLATE, чтобы заменить им все числовые символы. После выполнения следующего запроса, например, можно увидеть слева исходные данные, а справа результаты первой подстановки:

select data,

translate(data,0123456789,##########) as tmp from V

DATA

CLARK

7782

ACCOUNTING

CLARK

####

ACCOUNTING

KING

7839

ACCOUNTING

KING

####

ACCOUNTING

MILLER

7934

ACCOUNTING

MILLER

####

ACCOUNTING

SMITH

7369

RESEARCH

SMITH

####

RESEARCH

JONES

7566

RESEARCH

JONES

####

RESEARCH

SCOTT

7788

RESEARCH

SCOTT

####

RESEARCH

ADAMS

7876

RESEARCH

ADAMS

####

RESEARCH

FORD

7902

RESEARCH

FORD

####

RESEARCH

ALLEN

7499

SALES

ALLEN

####

SALES

WARD

7521

SALES

WARD

####

SALES

MARTIN

7654

SALES

MARTIN

####

SALES

BLAKE

7698

SALES

BLAKE

####

SALES

TURNER

7844

SALES

TURNER

####

SALES

JAMES

7900

SALES

JAMES

####

SALES

ANSLATE находит числа

в строках и

заменяет каждое символом

# . После этого измененные строки возвращаются в REPLACE (строка 11), которая удаляет все экземпляры # :

select data, replace(



1 ... 46 47 48 [ 49 ] 50 51 52 ... 219

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