|
Программирование >> Преобразование значений null
PostgreSQL С помощью функций TRANSLATE, REPLACE и INSTR выделяем числовые значения в каждой строке. В представлении V вызывать CAST необязательно. Функция REPLACE используется для удаления лишних пробелов, возникающих в результате приведения к типу фиксированной длины CHAR. По желанию можно выполнять явное приведение в описании представления, предлагается приводить к типу VARCHAR: 1 select cast( 2 case 3 when 4 replace(translate(mixed,0123456789,9999999999),9,) 5 is not null 6 then 7 replace( 8 translate(mixed, 9 replace( 10 translate(mixed,0123456789,9999999999),9, ), 8 and ascii(substr(v.mixed,iter.pos,1)) between 48 and 57 9 ) y 10 group by mixed 11 order by 1 Oracle С помощью функций TRANSLATE, REPLACE и INSTR выделяем числовые значения в каждой строке. В представлении V вызывать CAST необязательно. Функция REPLACE используется для удаления лишних пробелов, возникающих в результате приведения к типу фиксированной длины CHAR. По желанию можно выполнять явное приведение типа в описании представления, предлагается приводить к типу VARCHAR2: 11 rpad(# ,length(mixed),#)),#, ) 12 else 13 mixed 14 end as integer ) as mixed 15 from V 16 where strpos(translate(mixed,0123456789,9999999999),9) > 0 SQL Server Без труда найти строки, содержащие числа, позволяет встроенная функция ISNUMERIC с групповым символом. Но извлечь числовые символы из строки не так просто, потому что функция TRANSLATE не поддерживается. Обсуждение Функция TRANSLATE здесь очень полезна, поскольку позволяет выделять и идентифицировать числа и символы. Хитрость состоит в замене всех чисел одним символом, в результате чего ведется поиск не разных чисел, а всего одного символа. DB2, Oracle и PostgreSQL Синтаксис для этих СУБД немного отличается, но прием один. Обсудим на примере решения для PostgreSQL. Основную работу выполняют функции TRANSLATE и REPLACE. Для получения окончательного результирующего множества необходимо выполнить несколько вызовов функций, как показано в запросе ниже: select mixed as orig, translate(mixed,0123456789,9999999999) as mixed1, replace(translate(mixed, 0123456789,9999999999),9, ) as mixed2, translate(mixed, replace( translate(mixed,0123456789,9999999999),9, ), rpad(#,length(mixed),#)) as mixed3, replace( translate(mixed, replace( translate(mixed,0123456789,9999999999), 9,), rpad(#,length(mixed),#)),#, ) as mixed4 from V where strpos(translate(mixed,0123456789,9999999999),9) > 0 ORIG MIXED1 MIXED2 MIXED3 MIXED4 MIXED5 CL10AR CL99AR CLAR ##10## 10 10 KI10NG KI99NG KING ##10## 10 10 MI10LL MI99LL MILL ##10## 10 10 7369 9999 7369 7369 7369 7566 9999 7566 7566 7566 7788 9999 7788 7788 7788 7902 9999 7876 7972 7872 Во-первых, обратите внимание, что удалены все строки, в которых нет чисел. Как это было сделано, станет понятным после рассмотрения каждого из столбцов приведенного выше результирующего множества. Строки, которые были оставлены, представлены в столбце ORIG, и они, в конечном счете, образуют результирующее множество. Первый шаг для извлечения чисел - применение функции TRANSLATE, которая заменяет каждое число числом 9 (может использоваться любое число; 9 выбрано произвольно). Результаты этой операции приведены в столбце MIXED1. Теперь, когда все числа представлены 9, с ними можно работать как с одним элементом. Следующий шаг - удалить все числа с помощью функции REPLACE. Поскольку все числа теперь представлены 9, REPLACE просто ищет числа 9 и удаляет их. Результаты данной операции показаны в столбце MIXED2. Далее эти значения используются для получения значений MIXED3: они сравниваются со значениями столбца ORIG; все символы значения MIXED2, найденные в значении ORIG, функция TRANSLATE заменяет символом #. Результаты, выведенные в MIXED3, показывают, что теперь выделены и заменены одним символом буквы, а не числа, и они могут обрабатываться как один элемент. Следующий шаг - использовать REPLACE для поиска и удаления из строк всех символов #. В строках сохраняются только числа, что показано в столбце MIXED4. Теперь остается только привести числовые символы к числовому типу данных. После поэтапного разбора всего процесса становится понятным, что делает предикат WHERE. Результаты из столбца MIXED1 передаются в STR-POS, и если обнаружена 9 (местоположение первой 9 в строке), результат должен быть больше 0. Если для строки возвращается значение больше нуля, значит, в этой строке есть, по крайней мере, одно число, и строка должна быть сохранена. MySQL Первый шаг - выполнить обход каждой строки, провести ее синтаксический разбор и определить, содержатся ли в ней числа: select v.mixed, iter.pos, substr(v.mixed,iter.pos,1) as c from V, ( select id pos from t10 ) iter where iter.pos <= length(v.mixed) order by 1,2 mixed pos c 7369 1 7 77336699 23 36
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |