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

1 ... 55 56 57 [ 58 ] 59 60 61 ... 219


select

to number (

case

when

replace(translate(mixed,0123456789,9999999999),9)

is not null

then

replace(

translate(mixed,

replace(

translate(mixed,0123456789,9999999999),9),

rpad(#,length(mixed),#)),#)

else

mixed

) mixed

from

where

instr(translate(mixed,0123456789,9999999999),9) > 0

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



1 ... 55 56 57 [ 58 ] 59 60 61 ... 219

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