Функция 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:
Следующее утверждение группирует сотрудников по длине их имен. Он использует функцию LENGTH() в предложении GROUP BY:
См. следующую таблицу продуктов:
Допустим, вам нужно отобразить список продуктов с их выдержками на веб-сайте компании.
Следующий оператор использует функцию LENGTH() с функциями CONCAT() и SUBSTR() для возврата выдержек для продуктов.
Если описание товара имеет длину менее 50, оно будет использоваться как выдержка. В противном случае будут использоваться первые 50 символов описания.
В этом руководстве вы узнали, как использовать функцию Oracle LENGTH() для получения количества символов в строке.
Я бы проверил, есть ли в строке сочетание цифр и букв.
COL1 | РЕЗУЛЬТАТ th> |
---|
012344 | Неверно |
GBSDK | False |
000ABC | True |
таблица>
Ответы
Вот один из способов сделать это:
length (перевести (col1, 'a0123456789', 'a')) между 1 и length (col1) - 1
Необходимость "а" или чего-то подобного в переводе объясняется в документации.
ПОСТАВЬТЕ ИМЯ ВАШЕЙ ТАБЛИЦЫ ВМЕСТО temp
WHEN LENGTH (TRIM (TRANSLATE (col1, '+-.0123456789', ' '))) > 0
AND LENGTH (TRIM (TRANSLATE (col1,'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', ' '))) > 0
ЭТО БЫЛ МОЙ СТОЛ...;)
Это даст true для любой строки, содержащей числа и что-то еще (не только буквы).
К вашему сведению +-. СЧИТАЮТСЯ ДЛЯ ЗНАКОВЫХ И ДЕСЯТИЧНЫХ ЧИСЕЛ..;)
Очевидно.Основываясь на представленном образце, я предположил, что могут возникнуть только буквенные и цифровые символы. Я предполагаю, что когда постер хочет, чтобы мы рассмотрели и других персонажей, они будут включать их в выборку. (Я знаю, что это предположение верно примерно в 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
Читайте также: