Как получить целое число из столбца без использования regexp_like

#sql #oracle #oracle11g #oracle10g #oracle12c

Вопрос:

У меня есть столбец X , в Oracle котором есть такие значения, как «a1b2c3», «abc», «1ab», «123», «156-346»

как мне написать sql-запрос, который возвращает мне только те X , которые содержат чистые числовые значения, такие как 123,456 etc.

Я не могу использовать regexp_like , потому что я использую 10g .

Ответ №1:

Вот два варианта: один использует регулярные выражения, другой translate -функцию.

 SQL> with test as
  2    (select 'a1b2c3' col from dual union all
  3     select 'abc'        from dual union all
  4     select '1ab'        from dual union all
  5     select '123'        from dual union all
  6     select '156-346'    from dual
  7    )
  8  select col,
  9    regexp_replace(col, '[^[:digit:]]') result,
 10    --
 11    translate(col, '0'|| translate(col, '$0123456789', '


Комментарии:

1. Спасибо. но я не могу использовать regexp_replace, и я хочу использовать это в предложении where

2. Пожалуйста. Я добавил еще одну опцию, использующую функцию ПЕРЕВОДА. Посмотрим, поможет ли это.

3. На самом деле маленькая ножка, если столбец содержит строку, ее просто нужно игнорировать. на данный момент, если один столбец содержит 1, а другой столбец 1abc, он дает значение true.

4. может ли он дать значение null или 0, если столбец содержит что-либо, кроме целого числа?

Ответ №2:

При использовании translate функции для удаления всех цифр и обрезки результата чистые числа дадут null

 select x
from test
where trim(translate(x, '0123456789', '          ')) is null;
 

Убедитесь, что последним параметром должно быть 10 пробелов translate .

Если x столбец может содержать пробелы, то используйте

 select x
from test
where trim(translate(replace(x,' ','*'), '0123456789', '          ')) is null;
 

см.: http://sqlfiddle.com/#!4/772dc7d/2/0

), '0') result2
12 from test;

COL RESULT RESULT2
------- ------- -------
a1b2c3 123 123
abc
1ab 1 1
123 123 123
156-346 156346 156346

SQL>

Комментарии:

1. Спасибо. но я не могу использовать regexp_replace, и я хочу использовать это в предложении where

2. Пожалуйста. Я добавил еще одну опцию, использующую функцию ПЕРЕВОДА. Посмотрим, поможет ли это.

3. На самом деле маленькая ножка, если столбец содержит строку, ее просто нужно игнорировать. на данный момент, если один столбец содержит 1, а другой столбец 1abc, он дает значение true.

4. может ли он дать значение null или 0, если столбец содержит что-либо, кроме целого числа?

Ответ №2:

При использовании translate функции для удаления всех цифр и обрезки результата чистые числа дадут null


Убедитесь, что последним параметром должно быть 10 пробелов translate .

Если x столбец может содержать пробелы, то используйте


см.: http://sqlfiddle.com/#!4/772dc7d/2/0