Среди всех ответов, для задачи выше, это самый лучший:
mysql> use db_name;
mysql> source file_name.sql;
Вы уже получили несколько хороших ответов о том, как продолжить свой текущий путь. Позвольте мне предложить другой путь: используйте вместо этого тип данных number (9,0).
Причины:
Вам не нужно дополнительное ограничение проверки, чтобы подтвердить, что оно содержит действительное число.
Вы являетесь не обмануть оптимизатор. Например, сколько prod_num составляет «МЕЖДУ '000000009' и '000000010'»? Здесь умещается множество символьных строк. Тогда как "prod_num от 9 до 10", очевидно, выбирает только два числа. Количество элементов будет лучше, что приведет к лучшим планам выполнения.
Вы не обманываете будущих коллег, которые должны поддерживать ваш код. Если присвоить ему имя "prod_num", они автоматически предположат, что он содержит число.
Ваше приложение может использовать lpad (to_char (prod_num), 9, '0'), Роб.
(обновлено MH) В ветке комментариев есть обсуждение, которое хорошо иллюстрирует различные аспекты этого подхода, которые следует учитывать. Если эта тема интересна, прочтите их.
Работает во всех версиях:
TRANSLATE(PROD_NUM,'123456789','000000000') = '000000000'
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
Не уверен в производительности, но если вы знаете диапазон, следующее будет работать. Использует ограничение 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 );
Преобразовать его в целое число, вернуть обратно в varchar и проверить, соответствует ли оно исходной строке?
В MSSQL я мог бы использовать что-то вроде этого в качестве теста ограничения:
PROD_NUM NOT LIKE '%[^0-9]%'
Я не человек Oracle, но я не думаю, что они поддерживают списки символов в квадратных скобках.