Oracle: SQL-запрос, который возвращает строки только с числовыми значениями
У меня есть поле (столбец в Oracle), называемое X, которое имеет такие значения, как "a1b2c3", "abc", "1ab", "123", "156"
Как написать sql-запрос, который возвращает мне только X, который содержит чистые числовые значения = нет букв? из приведенного выше примера будет "123" и "156"
выберите X
от myTable
где...??
Ответы
Ответ 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] * $');