|
Программирование >> Преобразование значений null
union all select concat(ename $,sal,.00) as data from emp where deptno=20 union all select concat(ename,deptno) as data from emp where deptno=30 Для выбора строк, содержащих не только буквенно-цифровые данные, используем регулярное выражение: 1 select data 2 from V 3 where data regexp [ 0-9a-zA-Z] = 0 Oracle и PostgreSQL С помощью функции TRANSLATE замените все буквенно-цифровые символы каким-то одним символом. Затем выберите строки, в которых, кроме заданного, содержатся и другие символы. В Oracle и PostgreSQL вызов функции CAST в представлении V не нужен. Будьте особенно аккуратными при приведении к CHAR, поскольку это тип фиксированной длины (с дополнением пробелами). Если необходимо привести к символьному типу данных, лучше использовать типы VARCHAR или VARCHAR2: 1 select data 2 from V 3 where translate(lower(data), 4 0123456789abcdefghi]klmnopqrstuvwxyz, 5 rpad(a,36,a)) = rpad(a,length(data),a) SQL Server Поскольку SQL Server не поддерживает функции TRANSLATE, приходится обходить каждую строку и выбирать из строк те, в которых содержатся символы, не являющиеся буквенно-цифровыми значениями. Это можно сделать разными способами, но в приведенном ниже решении используется анализ ASCII-значения: 1 select data 2 from ( 3 select v.data, iter.pos, 4 substring(v.data,iter.pos,1) c, 5 ascii(substring(v.data,iter.pos,1)) val 6 from v, 7 ( select id as pos from t100 ) iter 8 where iter.pos <= len(v.data) 9 ) x 10 group by data 11 having min(val) between 48 and 122 ALLEN30 Буквенно-цифровые значения заменены, но длины строк остались неизменными. Поэтому выбрать необходимо те строки, для которых вызов TRANSLATE возвращает строку, состоящую только из символов а . Выбор строк осуществляется через сравнение длины исходной строки с длиной соответствующей ей строки символов а : select data, translate(lower(data), 0123456789abcdefghijklmnopqrstuvwxyz, rpad(a,36,a)) translated, rpad(a,length(data),a) fixed aaaaaaa Обсуждение Суть данных решений - в возможности ссылаться одновременно на множество символов. Используя функцию TRANSLATE, можно без труда манипулировать всеми числами или всеми символами без необходимости перебора и проверки каждого символа, один за другим. DB2, Oracle и PostgreSQL Лишь 9 из 14 строк представления V являются буквенно-цифровыми. Чтобы выбрать только их, просто используем функцию TRANSLATE. В данном примере TRANSLATE заменяет символы 0-9 и a-z символом а . После выполнения замены преобразованные строки сравниваются со строкой символов а той же длины (что и рассматриваемая строка). Если длины строк одинаковые, значит, все символы проверяемой строки являются буквенно-цифровыми и других символов в ней нет. Используя функцию TRANSLATE (применяется синтаксис Oracle): where translate(lower(data), 0123456789abcdefghijklmnopqrstuvwxyz, rpad(a,36,a)) заменяем все числа и буквы особым символом (я выбрал а ). После выполнения такой замены все строки, которые в самом деле являются буквенно-цифровыми, могут быть идентифицированы как строки, образованные одним символом (в данном случае а ). Это можно увидеть, выполнив отдельно функцию TRANSLATE: select data, translate(lower(data), 0123456789abcdefghijklmnopqrstuvwxyz, rpad(a,36,a)) from V DATA TRANSLATE(LOWER(DATA) CLARK aaaaa SMITH, $800.00 aaaaa, $aaa.aa from V DATA TRANSLATED FIXED CLARK SMITH, $800.00 ALLEN30 aaaaa aaaaa, $aaa.aa aaaaaaa aaaaa aaaaaaaaaaaaaa aaaaaaa Последний шаг - выбрать только те строки, для которых значение столбца TRANSLATED равно значению столбца FIXED. MySQL Выражение предиката WHERE: where data regexp [ 0-9a-zA-Z] = 0 обусловливает выбор строк, содержащих только числа или символы. Диапазоны значений в квадратных скобках, 0-9a-zA-Z , представляют все возможные числа и буквы. Символ является символом отрицания. Таким образом, выражение можно прочитать как не числа или не буквы . Возвращаемое значение 1 соответствует выполнению условия, 0 - невыполнению. Итак, все выражение гласит: возвращение строк, в которых есть какие-то другие символы, кроме чисел и символов, является ошибкой . SQL Server Первый шаг - выполнить обход каждой строки, возвращенной представлением V. Каждый символ значения столбца DATA (данные) будет возвращен в отдельной строке таблицы. Столбец С представляет символы значений столбца DATA: data pos c val
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |