Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Вы можете использовать функцию 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> 

Ответ 2

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

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

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

Ответ 3

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

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

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

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

Ответ 4

А как насчет 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;
/

Ответ 5

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

http://66.221.222.85/reference/regexp.html

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

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

Ответ 6

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

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

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

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

select * from tablename 
where LENGTH(TRIM(TRANSLATE(X, '+-.0123456789', ''))) is null

Ответ 7

Следующий запрос может быть полезен:

выберите * из MyTable, где regexp_like (X, '^ [0-9] * $');