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

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


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 (



select

e.ename old name,

row number() over(partition by e.ename

order by substr(e.ename,iter.pos,1))

substr(e.ename,iter.pos,1) c

from

emp e,

( select rownum pos from emp ) iter

where

iter.pos <= length(e.ename)

order

by 1

start

with rn = 1

connect

by prior rn = rn-1 and prior old name = old name

where

length(old name) = length(new name)

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 использует это представление:

1 select

ename,

max(case when

pos=1 then

case

when cnt=1 then c

else rpad(c,cast(cnt

else

end)

max(case when

pos=2 then

case

when cnt=1 then c

else rpad(c,cast(cnt

else

end)M

max(case when

pos=3 then

case

when cnt=1 then c

else rpad(c,cast(cnt



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

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