|
Программирование >> Преобразование значений null
ADAMS ALLEN BLAKE CLARK FORD JAMES JONES KING MARTIN MILLER SCOTT SMITH TURNER WARD Желаемый результат: OLD NAME NEW NAME ADAMS AADMS ALLEN AELLN BLAKE ABEKL CLARK ACKLR FORD DFOR JAMES AEJMS JONES EJNOS KING GIKN MARTIN AIMNRT MILLER EILLMR SCOTT COSTT SMITH HIMST TURNER ENRRTU WARD ADRW Решение Эта задача - идеальный пример того, почему так исключительно важно понимать СУБД, с которой работаешь, и знать, какая функциональ- ,7654,7698,7782,7788, 7782 4 ,7654,7698,7782,7788, 7788 5 Заключительный шаг - привести значения (EMPNO) к числовому типу и поместить их в подзапрос. Упорядочение строки в алфавитном порядке Задача Требуется расположить символы строк таблицы в алфавитном порядке. Рассмотрим следующее множество: ENAME ность доступна. В тех ситуациях, когда используемая СУБД не предоставляет встроенные функции для решения задачи, необходимо применять творческий подход. Сравните решение MySQL с остальными. Чтобы расположить строковые значения в алфавитном порядке, необходимо обойти каждую строку и упорядочить ее символы: 10 11 12 13 14 15 16 17 18 19 select from select from where group ename, max(case when pos=1 then c else end) max(case when pos=2 then c else end) max(case when pos=3 then c else end) max(case when pos=4 then c else end) max(case when pos=5 then c else end) max(case when pos=6 then c else end) e.ename, cast(substr(e.ename,iter.pos,1) as varchar(100)) c, cast(row number()over(partition by e.ename order by substr(e.ename,iter.pos,1)) as integer) pos emp e, (select cast(row number()over() as integer) pos from emp) iter iter.pos <= length(e.ename) by ename MySQL Ключ к решению в данном случае - функция GROUP CONCAT, которая не только осуществляет конкатенацию символов, составляющих каждое имя, но и упорядочивает их: 1 select ename, group concat(c order by c separator ) 2 from ( 3 select ename, substr(a.ename,iter.pos,1) c 4 from emp a, 5 ( select id pos from t10 ) iter 6 where iter.pos <= length(a.ename) 7 ) x 8 group by ename Oracle Функция SYS CONNECT BY PATH обеспечивает возможность создать список посредством итераций: 1 select old name, new name 2 from ( 3 select old name, replace(sys connect by path(c, ), ) new name 4 from (
PostgreSQL PostgreSQL не предлагает никаких встроенных функций для упрощения сортировки символов в строке, поэтому необходимо не только обойти все строки, но также заранее знать максимально возможную длину имени. В данном решении для удобства чтения кода используется представление V: create or replace view V as select x.* from ( select a.ename, substr(a.ename,iter.pos,1) as c from emp a, (select id as pos from t10) iter where iter.pos <= length(a.ename) order by 1,2 ) x Следующее выражение SELECT использует это представление:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |