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

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


else

end)

max(case when

pos=4 then

case

when cnt=1 then c

else rpad(c,cast(cnt as

integer),c)

else

end)

max(case when

pos=5 then

case

when cnt=1 then c

else rpad(c,cast(cnt as

integer),c)

else

end)

max(case when

pos=6 then

case

when cnt=1 then c

else rpad(c,cast(cnt as

integer),c)

else

end)

from

select

a.ename, a.c,

(select count(*)

from v b

where a.ename=b.ename and a.c=b.c )

as cnt,

(select count(*)+1

from v b

where a.ename=b.ename and b.c<a.c) as pos

from

group

by ename

SQL Server

Чтобы расположить символы строк в алфавитном порядке, необходимо обойти все строки и упорядочить их символы:

1 select ename,

max(case

when

pos=1 then

else

end)+

max(case

when

pos=2 then

else

end)+

max(case

when

pos=3 then

else

end)+

max(case

when

pos=4 then

else

end)+

max(case

when

pos=5 then

else

end)+

max(case

when

pos=6 then

else

end)

8 from (

9 select e.ename,

10 substring(e.ename,iter.pos,1) as c,

11 row number() over (

12 partition by e.ename

13 order by substring(e.ename,iter.pos,1)) as pos

14 from emp e,

15 (select row number()over(order by ename) as pos



Чтобы возвратить каждую букву каждого имени в отдельной строке, необходимо выполнить обход строки. Это осуществляет вложенный

запрос ITER.

Теперь, когда буквы всех имен выстроены в алфавитном порядке, осталось опять собрать их вместе в одну строку, сохранив этот порядок. Позиция каждой буквы определяется выражениями CASE (строки 2-7). Если найден символ в определенной позиции, то осуществляется его конкатенация с результатом следующего вычисления (следующего выражения CASE). Благодаря использованию агрегатной функции MAX в каждую позицию POS возвращается только один символ, таким образом, для каждого имени возвращается только одна строка. Вычисление CASE продолжается до числа 6 - максимального количества символов в любом имени таблицы EMP.

MySQL

Вложенный запрос Х (строки 3-6) возвращает каждый символ каждого имени в отдельной строке. Извлечением символов из имен занимается функция SUBSTR:

ENAME C

ADAMS A

ADAMS A

ADAMS D

ADAMS M

ADAMS S

16 from emp) iter

17 where iter.pos <= len(e.ename)

18 ) x

19 group by ename

Обсуждение

DB2 и SQL Server

Вложенный запрос X возвращает каждый символ каждого имени в отдельной строке. Синтаксический разбор имени осуществляется функцией SUBSTR или SUBSTRING, а функция ROW NUMBER располагает символы в алфавитном порядке:

ENAME C POS

ADAMS A 1

ADAMS A 2

ADAMS D 3

ADAMS M 4

ADAMS S 5



Следующий шаг - взять выстроенные в алфавитном порядке символы и повторно объединить их в имена. Это выполняет функция SYS CONNECT BY PATH, добавляя каждый последующий символ в конец строки, полученной в результате объединения предыдущих:

OLD NAME NEW NAME ADAMS A

ADAMS AA ADAMS AAD

ADAMS AADM ADAMS AADMS

Заключительный шаг - оставить только те строки, длина которых равна длине имен, из которых они были построены.

PostgreSQL

Для удобства чтения в данном решении используется представление V для обхода строки. Функция SUBSTR в описании представления осуществляет посимвольный разбор каждого имени, так что представление возвращает следующее:

ENAME C

ADAMS A ADAMS A ADAMS D

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

Oracle

Основную работу осуществляет вложенный запрос Х (строки 5-11), в котором происходит разложение каждого имени на символы и расположение их в алфавитном порядке. Выполняется это путем обхода строки с последующим их упорядочиванием. Остальная часть запроса просто опять объединяет символы в имена.

Имена в разложенном виде можно увидеть, выполнив отдельно вложенный запрос X:

OLD NAME RN C

ADAMS 1 A

ADAMS 2 A

ADAMS 3 D

ADAMS 4 M

ADAMS 5 S



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

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