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

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


второе имя присоединяется к первому. Если второго имени нет, к первому имени добавляется еще одна запятая (этот процесс повторяется для каждого значения POS, пока не будет достигнута последняя строка).

Функция MAX необходима, потому что требуется создать по одному списку на отдел (можно также использовать MIN; в данном случае разницы нет, поскольку POS возвращает по одному значению при каждом вычислении выражения CASE). Если используется агрегатная функция, все элементы списка SELECT, не участвующие в агрегации, должны быть заданы в конструкции GROUP BY. Это гарантирует, что мы получим по одной строке на каждый такой элемент списка SELECT.

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

Преобразование данных с разделителями

в список оператора IN со множеством значений

Задача

Имеется список с разделителями, который требуется передать в итератор значений списка оператора IN конструкции WHERE. Рассмотрим следующую строку:

7654,7698,7782,7788

Хотелось бы применить эту строку в конструкции WHERE, но следующий фрагмент SQL приводит к ошибке, потому что EMPNO - числовой столбец:

select ename,sal,deptno from emp

where empno in ( 7654,7698,7782,7788 )

Ошибка возникает, поскольку EMPNO является числовым столбцом, а список оператора IN образован одним строковым значением. Необходимо, чтобы эта строка трактовалась как список разделенных запятыми числовых значений.

Решение

На первый взгляд может показаться, что SQL должен самостоятельно интерпретировать список с разделителями как список значений, но это не так. Встречая запятые между кавычками, SQL не может знать, что это признак списка со множеством значений. SQL трактует все, что заключено в кавычки, как одно строковое значение. Необходимо разложить строку на отдельные значения EMPNO. Ключ к этому решению - обойти строку, но не посимвольно, а разбить ее на корректные значения EMPNO.



select

from

where

select

from

select

from

where

where

MySQL

from t1) csv, (select id as pos

from t100 ) iter iter.pos <= length(c

) x

) y

Обходя строку, переданную в список оператора IN, можно без труда преобразовать ее в строки таблицы:

1 select empno, ename, sal, deptno

2 from emp

3 where empno in

5 select substring index(

6 substring index(list.vals ,iter.pos) ,-1) empno

6 from (select id pos from t10) as iter,

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

8 from t1) list

9 where iter.pos <=

10 (length(list.vals)-length(replace(list.vals ,)))+1

11 ) x

Oracle

Обходя строку, переданную в список оператора IN, можно без труда преобразовать ее в строки таблицы. Функции ROWNUM, SUBSTR и INSTR будут здесь особенно полезны:

1 select empno,ename,sal,deptno

2 from emp

3 where empno in (

4 select to number(

5 rtrim(

6 substr(emps,

7 instr(emps ,1,iter.pos)+1,

8 instr(emps ,1,iter.pos+1) -

Обходя строку, переданную в список оператора IN, можно без труда преобразовать ее в строки таблицы. Функции ROWNUMBER, LOCATE и SUBSTR будут здесь особенно полезны:



select

ename,sal,deptno

from

where

empno in (

select

cast(empno as integer) as empno

from

select

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

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 ,))

) z

where

length(empno) > 0

) x

SQL Server

Обходя строку, переданную в список оператора IN, можно без труда преобразовать ее в строки таблицы. Функции ROW NUMBER, CHAR-INDEX и SUBSTRING будут здесь особенно полезны:

select

empno,ename,sal,deptno

from

where

empno in (select substring(c,2,charindex( c,2)-2) as empno

from

select

substring(csv.emps,iter.pos,len(csv.emps)) as c

from

(select ,+7654,7698,7782,7788+, as emps

from t1) csv,

(select id as pos

from t100) iter

where

iter.pos <= len(csv.emps)

) x

where

len(c) > 1

substring(c,1,1) = ,

Обсуждение

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

9 instr(emps ,1,iter.pos)) )) emps

10 from (select ,М7654,7698,7782,7788М, emps from t1) csv,

11 (select rownum pos from emp) iter

12 where iter.pos <= ((length(csv.emps)-

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

14 )

PostgreSQL

Обходя строку, переданную в список оператора IN, можно без труда преобразовать ее в строки таблицы. Функция SPLIT PART упрощает задачу синтаксического разбора строки на отдельные числовые значения:



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

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