Функция 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, подумайте о том, действительно ли категории, группы и номера продуктов не сохраняются в виде текста.