|
Программирование >> Преобразование значений null
Вложенный запрос 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
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |