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

1 ... 51 52 53 [ 54 ] 55 56 57 ... 219


7654 7698 7782

Последний шаг - использовать результаты в подзапросе для возвращения необходимых строк.

бить ее на отдельные числовые значения, используя предоставленные СУБД функции.

DB2 и SQL Server

Обход строки выполняет вложенный запрос Х (строки 6-11). Основная идея решения - пройти по строке так, чтобы в каждой следующей строке было на один символ меньше, чем в предыдущей:

,7654,7698,7782,7788,

7654,7698,7782,7788,

654,7698,7782,7788,

54,7698,7782,7788,

4,7698,7782,7788,

,7698,7782,7788,

7698,7782,7788,

698,7782,7788,

98,7782,7788,

8,7782,7788,

,7782,7788,

7782,7788, 782,7788,

82,7788,

Обратите внимание, благодаря тому, что строка заключена в запятые (разделитель), нет необходимости в специальных проверках для определения начала или конца строки.

Следующий шаг - выбрать только те значения, которые войдут в список оператора IN. Это значения, начинающиеся с запятой, за исключением последней строки, в которой запятая является единственным символом. С помощью функции SUBSTR или SUBSTRING находим такие строки и затем для каждой из них сохраняем все символы до следующей запятой. Когда это сделано, приводим строки к числовому типу, чтобы они могли быть помещены в числовой столбец EMPNO (строки 4-14):

EMPNO



MySQL

Вложенный запрос (строки 5-9) осуществляет обход строки. Выражение в строке 10 определяет количество значений в строке, подсчитывая число запятых (разделителей) и добавляя к нему единицу. Функция SUBSTRING INDEX (строка 6) возвращает все символы строки до (слева) и-ной запятой (разделителя):

+---------------------+

empno

+---------------------+

7654

7654,7698

7654,7698,7782

7654,7698,7782,7788

+---------------------+

Затем эти строки передаются в еще одну SUBSTRING INDEX (строка 5); на этот раз n-ным разделителем является первая запятая, поэтому сохранены будут все значения справа от n-ного разделителя:

+-------+

empno +-------+

7654

7698

+-------+

Последний шаг - вставить результаты в подзапрос. Oracle

Первый шаг - обход строки:

select emps,pos from (select ,7654,7698,7782,7788, emps from t1) csv, (select rownum pos from emp) iter where iter.pos <=

((length(csv.emps)-length(replace(csv.emps, ,)))/length(,))-1

EMPS POS

,7654,7698,7782,7788, 1

,7654,7698,7782,7788, 2

,7654,7698,7782,7788, 3

,7654,7698,7782,7788, 4

Число возвращенных строк представляет количество значений в списке. Значения POS очень важны, потому что они необходимы в запросе для проведения синтаксического разбора строки. Синтаксический разбор строки осуществляется с помощью функций SUBSTR и INSTR.



7654, 7698, 7782,

7788,

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

PostgreSQL

Обход строки осуществляет вложенный запрос Z (строки 6-9). Количество возвращаемых строк соответствует количеству значений в строке. Чтобы определить, сколько значений в строке, находим разность между размером строки с разделителями и ее размером без них (строка 9). Синтаксическим разбором строки занимается функция SPLIT PART. Она ищет значение, располагающееся перед и-ным разделителем:

select list.vals,

split part(list.vals ,iter.pos) as empno, iter.pos

from (select id as pos from t10) iter,

(select ,7654,7698,7782,7788, as vals

from t1) list

where iter.pos <=

length(list.vals)-length(replace(list.vals ,))

vals empno pos

,7654,7698,7782,7788, 1

,7654,7698,7782,7788, 7654 2 ,7654,7698,7782,7788, 7698 3

POS используется для определения местонахождения и-ного разделителя в каждой строке. Поскольку строки окружены запятыми, дополнительных проверок для определения начала или конца строки не требуется. Значения передаются в SUBSTR, INSTR (строки 7-9) находит и-й и и+1-й разделители. Вычитая значение, возвращенное для текущей запятой (местоположение текущей запятой в строке), из значения, возвращенного для следующей запятой (местоположение следующей запятой в строке), можно извлечь все значения строки:

select substr(emps,

instr(emps , 1,iter.pos)+1, instr(emps ,1,iter.pos+1) -instr(emps ,1,iter.pos)) emps from (select ,7654,7698,7782,7788, emps from t1) csv, (select rownum pos from emp) iter where iter.pos <= ((length(csv.emps)-length(replace(csv.emps )))/length(,))-1

EMPS



1 ... 51 52 53 [ 54 ] 55 56 57 ... 219

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