|
Программирование >> Преобразование значений null
второе имя присоединяется к первому. Если второго имени нет, к первому имени добавляется еще одна запятая (этот процесс повторяется для каждого значения 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.
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 будут здесь особенно полезны:
SQL Server Обходя строку, переданную в список оператора IN, можно без труда преобразовать ее в строки таблицы. Функции ROW NUMBER, CHAR-INDEX и SUBSTRING будут здесь особенно полезны:
Обсуждение Первый и самый важный шаг в данном решении - обход строки. После этого остается только провести синтаксический разбор строки и раз- 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 упрощает задачу синтаксического разбора строки на отдельные числовые значения:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |