Функция SQLite для форматирования чисел с ведущими нулями?
У меня есть база данных SQLite, которая должна содержать продукты. Эти продукты имеют составной номер продукта с фиксированным форматом, состоящий из категории, группы и номера продукта (cccccc.gg.ppp). Каждый раз, когда вставлен новый продукт, новый номер продукта должен быть построен с использованием номеров категорий и групп, за которыми следует наивысший номер продукта в этой группе, увеличенный на один.
С этой целью я думал хранить все три числа в отдельных полях и использовать представление для динамической сборки номера продукта. Для этого мне нужно будет добавить ведущие нули, так как формат номеров продуктов исправлен.
Однако я не могу найти встроенную функцию SQLite, которая позволила бы мне это сделать...: - (
Id скорее не пишет пользовательскую функцию, так как нам, возможно, придется разделить базу данных с другими разработчиками, чтобы они могли читать данные; и я понятия не имею, какую платформу или язык они будут использовать.
Можно ли это сделать? Или нам нужно найти другое решение?
Ответы
Ответ 1
Это может быть достигнуто с помощью магии с использованием конкатенации строк и функции substr
. Короче говоря, вот что вам нужно:
select substr('0000000000'||'1234', -10, 10)
Далее следует объяснение.
Во-первых, знайте, что оператор конкатенации строки SQLite ||
.
Начнем с того, что мы берем строку, которая до тех пор, пока значение, которое мы хотим вернуть. Например, если вы хотите вернуть число, которое всегда равно 10 символам, и пусть оно будет заполнено с помощью 0
, если оно короче, начните с строки из десяти 0
s. Для этого мы объединим число, которое вы хотите вернуть. В нашем примере это "1234". До сих пор у нас есть та часть, которая выглядит так: '0000000000'||'1234'
Затем передайте все это в функцию substr
. В соответствии с документацией здесь работает функция substr
:
Функция substr (X, Y, Z) возвращает подстроку входной строки X, которая начинается с Y-го символа и которая является символом Z длинной.... Если Y отрицательный, то первый символ подстроки получается путем подсчета справа, а не слева.
Итак, если вы хотите, чтобы строка имела длину 10 символов, передайте -10 в качестве параметра Y (чтобы начать отсчет справа, 10 символов назад) и передайте 10 в качестве параметра Z (для получения всего 10 символов).
Ответ 2
select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)
работает; замените '1234'
на ваш номер продукта, любая длина <= 10.
Ответ 3
Я знаю, что это старый вопрос, но следующее проще:
-- zero-pad to 4 digits:
select substr('0000'||3,-4);
substr
не требует длины, если вы выбираете до конца.
Ответ 4
Начиная с 3.8.3 (2014), вы можете использовать printf как:
SELECT printf('%04d', product_number) AS product_number FROM table;
Измените 4 на столько цифр, сколько вам нужно. Это вернуло бы 0001 для product_number 1.
Ответ 5
В дополнение к прямому ответу на ваш вопрос с @9000, подумайте о том, действительно ли категории, группы и номера продуктов не сохраняются в виде текста.