Проверочная строка Oracle для числа

Обновлено: 30.06.2024

Функция Oracle LENGTH() возвращает количество символов в указанной строке. Он измеряет длину строки в символах, как определено входным набором символов.

Синтаксис

Следующее иллюстрирует синтаксис функции Oracle LENGTH():

Аргументы

Функция Oracle LENGTH() принимает один аргумент:

строковое_выражение

— это строка или выражение, которое возвращает строку для оценки. Строковое_выражение может быть константой, переменной или столбцом таблицы.

Тип данных аргумента string_expression может быть любым из следующих типов данных CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB или NCLOB.

Возвращаемое значение

Функция LENGTH() возвращает положительное целое число, представляющее количество символов в string_expression .

Если строковое_выражение равно NULL, функция LENGTH() возвращает NULL.

Если string_expression имеет тип данных CHAR, его длина будет включать все начальные и конечные пробелы.

Примеры

Следующий оператор использует функцию LENGTH() для вычисления количества символов строки "Oracle LENGTH" с использованием однобайтового набора символов базы данных:

См. следующую таблицу сотрудников в образце базы данных:

Следующий оператор сортирует сотрудников по длине их имен. Он использует функцию LENGTH() в предложении ORDER BY:

Oracle LENGTH с примером ORDER BY

Следующее утверждение группирует сотрудников по длине их имен. Он использует функцию LENGTH() в предложении GROUP BY:

См. следующую таблицу продуктов:

Допустим, вам нужно отобразить список продуктов с их выдержками на веб-сайте компании.

Следующий оператор использует функцию LENGTH() с функциями CONCAT() и SUBSTR() для возврата выдержек для продуктов.

Если описание товара имеет длину менее 50, оно будет использоваться как выдержка. В противном случае будут использоваться первые 50 символов описания.

В этом руководстве вы узнали, как использовать функцию Oracle LENGTH() для получения количества символов в строке.

Я бы проверил, есть ли в строке сочетание цифр и букв.

Лучший ответ

Возможно

с

данные как

(выберите '012344' col1 из двойного объединения всех

выберите «GBSDK» из двойного объединения всех

выберите "000ABC" из двойного

выберите col1,

случай, когда regexp_like(col1,'[[:digit:]и regexp_like(col1,'[[:alpha:]]')

затем "Истина"

еще "Ложь"

конечный результат

из данных

Ответы

Вот один из способов сделать это:

mathguy

length (перевести (col1, 'a0123456789', 'a')) между 1 и length (col1) - 1

Необходимость "а" или чего-то подобного в переводе объясняется в документации.

Высах Суреш - 3035408< бр />

ПОСТАВЬТЕ ИМЯ ВАШЕЙ ТАБЛИЦЫ ВМЕСТО temp

WHEN LENGTH (TRIM (TRANSLATE (col1, '+-.0123456789', ' '))) > 0

AND LENGTH (TRIM (TRANSLATE (col1,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ' '))) > 0

Высах Суреш - 3035408< бр />

ЭТО БЫЛ МОЙ СТОЛ...;)

pastedImage_2.jpg

pastedImage_7.jpg

Это даст true для любой строки, содержащей числа и что-то еще (не только буквы).

Высах Суреш - 3035408< бр />

К вашему сведению +-. СЧИТАЮТСЯ ДЛЯ ЗНАКОВЫХ И ДЕСЯТИЧНЫХ ЧИСЕЛ..;)

mathguy

Очевидно.Основываясь на представленном образце, я предположил, что могут возникнуть только буквенные и цифровые символы. Я предполагаю, что когда постер хочет, чтобы мы рассмотрели и других персонажей, они будут включать их в выборку. (Я знаю, что это предположение верно примерно в 30% случаев, но я все равно делаю это). В противном случае нам придется учитывать непечатаемые символы, такие как системный звонок.

Возможно

с

данные как

(выберите '012344' col1 из двойного объединения всех

выберите «GBSDK» из двойного объединения всех

выберите "000ABC" из двойного

выберите col1,

случай, когда regexp_like(col1,'[[:digit:]и regexp_like(col1,'[[:alpha:]]')

Это довольно плохая практика — использовать обработку исключений для определения чего-то, что можно вычислить вычислением. В основном потому, что обработка исключений вызывает дополнительные накладные расходы на производительность. Эта функция ниже работает примерно в два раза быстрее.

LENGTH(TRIM(TRANSLATE(myfield, ' +-.0123456789', ' '))) не равно null

Пожалуйста, проверьте, что ваш код не работает, он говорит, что "A1B23C456" является числовым

с t как
(
выбрать мое поле 'A1B23C456' из двойного
)
выбрать мое поле из t
где ДЛИНА(ОТРЕЗАТЬ(ПЕРЕВОД(myfield, ' + -.0123456789', ' '))) не равно null

Обратите внимание: здесь мы проверяем, имеет ли поле значение, которое можно преобразовать в число.

Замените последний параметр на 13 (от 0 до 9, + - и точка) пробелов в кавычках

Нимиш Гарг, вы неверно истолковали этот очень простой фрагмент кода. Код, который у вас есть, выбирает строки, которые НЕ являются числовыми - вы добавляете пробел для каждого поля, которое не является числовым. Итак, в вашем примере вы ищете значения, которые не являются числовыми. Если вам нужны числовые значения, просто измените значение «Is Not Null» на «Is Null»

Очевидно, это именно то, что я называю потрясающей статьей! Вы используете этот домен исключительно для личного удовольствия или он у вас действительно есть, чтобы получать прибыль с его помощью?

с t как
(
выбрать мое поле 'A1B23C456' из двойного
)
выбрать мое поле из t
где ДЛИНА(ОТРЕЗАТЬ(ПЕРЕВОД(myfield, ' + -.0123456789', ''))) не равно нулю, на самом деле это работает. Но чтобы найти числовые значения, вы должны проверить, что это null.

Плохая сторона этого типа "анализа" данных, которые должны быть числовыми, заключается в том, что следующее также приведет к "нулю", что означает "числовой":
выбрать ДЛИНА(ОТРЕЗАТЬ(ПЕРЕВОД ('-.+56 ', ' +-.0123456789',' '))) из двойного;

Пробелы также считаются числовыми.

не по этому коду

Для более тщательной проверки (т. е. "+123,4" – это числовое значение, "+123..4" – нечисловое):

ВЫБЕРИТЕ РАСШИФРОВКУ(ПЕРЕВОД(РАСШИФРОВАТЬ(INSTR(:VAL,'.',1,2),0,
DECODE(INSTR(:VAL,'+',1,2),0,
DECODE(INSTR(:VAL,'-',1,2),0,:VAL
,'X')
,'X')
,'X'), 'X+-0123456789.','X'),NULL
,DECODE(LENGTH(TRANSLATE(:VAL,'+-0123456789.','+-')),2,'NON_NUMERIC','NUMERIC' ),'NON_NUMERIC') NUMERIC_VALUE
FROM DUAL;

это говорит о том, что 1+ и + и - являются числовыми. Я предполагаю, что правильно:

SELECT
case
когда instr(trim(:VAL), '+') > 1, то 'NON_NUMERIC'
когда instr(trim(:VAL), '-') > 1, затем 'NON_NUMERIC'
else DECODE(
TRANSLATE(DECODE(INSTR(:VAL,'.',1,2),0,
DECODE(INSTR(:VAL,'+' ,1,2),0,
DECODE(INSTR(:VAL,'-',1,2),0, :VAL, 'X'), 'X'),'X'),
'X+-0123456789.','X'),NULL,
DECODE(LENGTH(TRANSLATE(:VAL,'+-0123456789.','+-')),2,'NON_NUMERIC',' NUMERIC'),'NON_NUMERIC')
end NUMERIC_VALUE
FROM DUAL;

Я написал очень примитивную функцию для проверки того, является ли содержимое поля VARCHAR числовым. Функция просто проверяет, находится ли каждый символ в поле в диапазоне от 0 до 9.

Мне кажется, что это очень неэффективный способ проверки числовых/нечисловых данных.

Есть ли лучший способ сделать это?

Комментарии

CREATE OR REPLACE function IS_NUMBER(str in varchar2) return varchar2 IS
фиктивное число;
начать
пустышку := TO_NUMBER(str);
возврат ("ИСТИНА");
Исключение WHEN OTHERS then
return ('FALSE');
конец;

Так просто, я и не подумал ловить Exception. Можно ли сказать, что я новичок?

Большое спасибо!

Здравствуйте,
Мое решение может быть неэффективным способом проверки номера. Но вы можете использовать его без написания функции.

SQL>создать или заменить функцию is_num(n varchar2)
вернуть varchar2
начать
для v в цикле 1..length(n)
если нет((ascii (substr(n,v,1))>=48) и (ascii(substr(n,v,1)) select is_num('25') из двойного; ----- возвращает T
SQL > выберите is_num('2A4R') из двойного; -- возвращает F

это поможет вам лучше понять
ура
SHUBH

Здравствуйте,
Извините, что не учел. , и - .

В число можно включить любой символ

Не говоря уже о том, что IP-адреса не являются числовыми, несмотря на то, что полностью состоят из цифр и точек (255.255.255.0).

Это происходит время от времени, и самый простой способ определить, является ли какая-либо строка числовым, — это написать функцию для перехвата исключения ORA-1722 (или любого другого). Если производительность является реальной проблемой, мы всегда можем использовать нативную компиляцию. Хотя к настоящему времени Oracle действительно должен предоставлять эти вещи как встроенные модули. Я думаю, это та старая проблема, что SQL снова не поддерживает типы данных BOOLEAN.

Я знаю, что поздно отвечать здесь. но вот еще один способ сделать это (хотя и 10 г):

выберите декодирование (REGEXP_INSTR ('1234', '[^[:digit:]]'),0,'NUMBER','NOT_NUMBER') из двойного;
-- возвращает ЧИСЛО

выберите декодирование (REGEXP_INSTR ('12-34', '[^[:digit:]]'),0,'NUMBER','NOT_NUMBER') из двойного;
-- возвращает NOT_NUMBER

Читайте также:

COL1РЕЗУЛЬТАТ
012344Неверно
GBSDKFalse
000ABCTrue