Oracle: SQL-запрос, который возвращает строки только с числовыми значениями

У меня есть поле (столбец в Oracle) с именем X, который имеет значения, такие как "a1b2c3", "abc", "1ab", "123", "156"

Как мне написать SQL-запрос, который возвращает мне только X, которые содержат чистые числовые значения = без букв? из приведенного выше примера будет "123" и "156"

выберите X из myTable где...??

6 ответов

Решение

Вы можете использовать REGEXP_LIKE функционировать как:

SELECT X 
FROM myTable 
WHERE REGEXP_LIKE(X, '^[[:digit:]]+$');

Образец прогона:

SQL> SELECT X FROM SO;

X
--------------------
12c
123
abc
a12

SQL> SELECT X  FROM SO WHERE REGEXP_LIKE(X, '^[[:digit:]]+$');

X
--------------------
123

SQL> 

Если единственными символами для рассмотрения являются буквы, то вы можете сделать:

select X from myTable where upper(X) = lower(X)

Но, конечно, это не отфильтрует другие символы, только буквы.

Если вы используете Oracle 10 или выше, вы можете использовать функции регулярного выражения в соответствии с предложением codaddict. В более ранних версиях translate Функция поможет вам:

select * from tablename  where translate(x, '.1234567890', '.') is null;

Более подробную информацию о функции перевода Oracle можно найти здесь или в официальной документации "Справочник по SQL"

UPD: если у вас есть знаки или пробелы в ваших номерах, вы можете добавить "+-"символы ко второму параметру translate функция.

А как насчет 1.1E10, +1, -0 и т. Д.? Разбор всех возможных чисел сложнее, чем думают многие. Если вы хотите включить как можно больше чисел, вам следует использовать функцию to_number в функции PL/SQL. С http://www.oracle-developer.net/content/utilities/is_number.sql:

CREATE OR REPLACE FUNCTION is_number (str_in IN VARCHAR2) RETURN NUMBER IS
   n NUMBER;
BEGIN
   n := TO_NUMBER(str_in);
   RETURN 1;
EXCEPTION
   WHEN VALUE_ERROR THEN
      RETURN 0;
END;
/

Полный список функций regexp_like и других регулярных выражений в Oracle 11.1:

http://66.221.222.85/reference/regexp.html

В вашем примере:

SELECT X
FROM test
WHERE REGEXP_LIKE(X, '^[[:digit:]]$');

Вы можете использовать следующую команду -

LENGTH(TRIM(TRANSLATE(string1, '+-.0123456789', '')))

Это вернет NULL, если ваш string1 Числовой

Ваш запрос будет -

select * from tablename 
where LENGTH(TRIM(TRANSLATE(X, '+-.0123456789', ''))) is null
Другие вопросы по тегам