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