Oracle: SQL-запрос, который возвращает строки только с числовыми значениями - PullRequest
36 голосов
/ 14 октября 2010

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

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

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

Ответы [ 6 ]

62 голосов
/ 14 октября 2010

Вы можете использовать функцию 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> 
30 голосов
/ 14 октября 2010

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

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

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

7 голосов
/ 14 октября 2010

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

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

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

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

5 голосов
/ 15 октября 2010

А как насчет 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;
/
4 голосов
/ 14 октября 2010

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

http://66.221.222.85/reference/regexp.html

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

SELECT X
FROM test
WHERE REGEXP_LIKE(X, '^[[:digit:]]$');
3 голосов
/ 14 октября 2010

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

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

Это вернет NULL, если ваш string1 является числовым

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

select * from tablename 
where LENGTH(TRIM(TRANSLATE(X, '+-.0123456789', ''))) is null
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...