ОГРАНИЧЕНИЕ CHECK строки для содержания только цифр. (Oracle SQL)

Среди всех ответов, для задачи выше, это самый лучший:

 mysql> use db_name;
 mysql> source file_name.sql;
12
задан Shannon Severance 31 October 2011 в 21:13
поделиться

7 ответов

REGEXP_LIKE(PROD_NUM, '^[[:digit:]]{9}$')
15
ответ дан 2 December 2019 в 04:25
поделиться

Вы уже получили несколько хороших ответов о том, как продолжить свой текущий путь. Позвольте мне предложить другой путь: используйте вместо этого тип данных number (9,0).

Причины:

  • Вам не нужно дополнительное ограничение проверки, чтобы подтвердить, что оно содержит действительное число.

  • Вы являетесь не обмануть оптимизатор. Например, сколько prod_num составляет «МЕЖДУ '000000009' и '000000010'»? Здесь умещается множество символьных строк. Тогда как "prod_num от 9 до 10", очевидно, выбирает только два числа. Количество элементов будет лучше, что приведет к лучшим планам выполнения.

  • Вы не обманываете будущих коллег, которые должны поддерживать ваш код. Если присвоить ему имя "prod_num", они автоматически предположат, что он содержит число.

Ваше приложение может использовать lpad (to_char (prod_num), 9, '0'), Роб.

(обновлено MH) В ветке комментариев есть обсуждение, которое хорошо иллюстрирует различные аспекты этого подхода, которые следует учитывать. Если эта тема интересна, прочтите их.

12
ответ дан 2 December 2019 в 04:25
поделиться

Работает во всех версиях:

TRANSLATE(PROD_NUM,'123456789','000000000') = '000000000'
7
ответ дан 2 December 2019 в 04:25
поделиться

I think Codebender's regexp will work fine but I suspect it is a bit slow.

You can do (untested)

replace(translate(prod_num,'0123456789','NNNNNNNNNN'),'N',null) is null

1
ответ дан 2 December 2019 в 04:25
поделиться

Не уверен в производительности, но если вы знаете диапазон, следующее будет работать. Использует ограничение CHECK во время создания DDL.

alter table test add jz2 varchar2(4)
     check ( jz2 between 1 and 2000000 );

, как и

alter table test add jz2 varchar2(4)
     check ( jz2 in (1,2,3)  );

, это тоже будет работать

alter table test add jz2 varchar2(4)
         check ( jz2 > 0  );
-1
ответ дан 2 December 2019 в 04:25
поделиться

Преобразовать его в целое число, вернуть обратно в varchar и проверить, соответствует ли оно исходной строке?

0
ответ дан 2 December 2019 в 04:25
поделиться

В MSSQL я мог бы использовать что-то вроде этого в качестве теста ограничения:

PROD_NUM NOT LIKE '%[^0-9]%'

Я не человек Oracle, но я не думаю, что они поддерживают списки символов в квадратных скобках.

0
ответ дан 2 December 2019 в 04:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: