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

1 ... 44 45 46 [ 47 ] 48 49 50 ... 219


Вложенный запрос Z не только возвращает каждый символ столбца DATA в отдельной строке, но и предоставляет ASCII-значение для каждого символа. Для используемой мной конкретной реализации SQL Server буквенно-цифровым символам соответствует диапазон значений 48-122. Зная это, можно осуществлять группировку по столбцу DATA и отфильтровывать те строки, минимальное ASCII-значение которых не входит в диапазон 48-122.

Извлечение инициалов из имени

Задача

Требуется преобразовать имя в инициалы. Возьмем имя:

Stewie Griffin Необходимо получить:

S.G.

Решение

Важно помнить, что SQL не обеспечивает такой гибкости, как языки программирования С или Python; следовательно, создать универсальное решение для работы с любым форматом имен в SQL нелегко. Приведенные здесь решения предполагают, что имя представлено или именем и фамилией, или именем, отчеством/вторым инициалом и фамилией.

Для получения инициалов используйте встроенные функции REPLACE, TRANSLATE и REPEAT:

1 select replace(

2 replace(

3 translate(replace(Stewie Griffin, ),

4 repeat(#,26),

5 abcdefghijklmnopqrstuvwxyz),

6 #, ), ,. )

7 from t1

MySQL

Для получения инициалов используйте встроенные функции CON-CAT, CONCAT WS, SUBSTRING и SUBSTRING INDEX:

1 select case

2 when cnt = 2 then

3 trim(trailing . from

4 concat ws(.,

5 substr(substring index(name,



6 substr(name,

7 length(substring index(name, ,1))+2,1),

8 substr(substring index(name,

9 .))

10 else

11 trim(trailing . from

12 concat ws(.,

13 substr(substring index(name,

14 substr(substring index(name,

15 ))

16 end as initials

17 from (

18 select name,length(name)-length(replace(name, ,)) as cnt

19 from (

20 select replace(Stewie Griffin,.,) as name from t1

21 )y

22 )x

Oracle и PostgreSQL

Для получения инициалов используйте встроенные функции REPLACE, TRANSLATE и RPAD:

1 select replace(

2 replace(

3 translate(replace(Stewie Griffin, ),

4 abcdefghijklmnopqrstuvwxyz,

5 rpad(#,26,#) ), #, ), ) .

6 from t1

SQL Server1

На момент написания данной книги SQL Server не поддерживает ни функцию TRANSLATE, ни функцию CONCAT WS.

Обсуждение

Получить инициалы можно, выбирая из имени заглавные2 буквы. В следующих разделах подробно описаны решения для всех рассматриваемых СУБД.

Решение для SQL Server аналогично решению для MySQL, только вместо функции SUBSTRING INDEX используется функция CHARINDEX, а для конкатенации символ + . - Примеч. науч. ред.

В решениях для DB2, Oracle, PostgreSQL делается предположение, что первые буквы имен - прописные. Если использовать это же условие для SQL Server, то при помощи функции PATINDEX c шаблоном [ A-Z] можно найти позиции всех заглавных букв и вырезать затем эти буквы, используя функцию SUBSTRING. - Примеч. науч. ред.



S##### G######

На данном этапе инициалы - это символы, отличные от #. С помощью функции REPLACE удаляются все символы #:

select replace(

translate(replace(Stewie Griffin, ., ), repeat(#,26),

abcdefghijklmnopqrstuvwxyz),#,)

from t1

Следующий шаг - заменить пробелы точками опять же с помощью

функции REPLACE:

select replace( replace(

translate(replace(Stewie Griffin, ),

repeat(#,26),

abcdefghijklmnopqrstuvwxyz),#,), ,.) .

from t1

REPLA

Завершающий шаг - поставить точку в конце.

Oracle и PostgreSQL

Функция REPLACE удалит все точки из имени (чтобы обработать второй инициал), а функция TRANSLATE заменит все строчные буквы символом #.

select translate(replace(Stewie Griffin,.,), abcdefghijklmnopqrstuvwxyz,

rpad(#,26,#))

from t1

TRANSLATE(STE

Функция REPLACE удалит из имени все точки (чтобы обработать второй инициал), а функция TRANSLATE заменит все строчные буквы символом #.

select translate(replace(Stewie Griffin, ),

repeat(#,26),

abcdefghijklmnopqrstuvwxyz)

from t1

TRANSLATE(STE



1 ... 44 45 46 [ 47 ] 48 49 50 ... 219

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