Функция SQLite для форматирования чисел с ведущими нулями? - PullRequest
24 голосов
/ 04 февраля 2011

У меня есть база данных SQLite, которая должна содержать продукты. Эти продукты имеют составной номер продукта фиксированного формата, состоящий из категории, группы и номера продукта (cccccc.gg.ppp). Каждый раз, когда вставляется новый продукт, новый номер продукта должен создаваться с использованием номеров категорий и групп, за которым следует наибольшее число продуктов в этой группе, увеличенное на единицу.

С этой целью я думал о сохранении всех трех чисел в отдельных полях и использовании представления для динамической сборки номера продукта. Чтобы это работало, мне нужно добавить начальные нули, поскольку формат номера продукта фиксирован.

Однако я не могу найти встроенную функцию SQLite, которая позволила бы мне сделать это ...: - (

Я бы не стал писать пользовательские функции, поскольку нам, возможно, придется делиться базой данных с другими разработчиками, чтобы они могли читать данные; и я не знаю, какую платформу или язык они собираются использовать.

Можно ли это сделать? Или нам нужно будет найти другое решение?

Ответы [ 4 ]

56 голосов
/ 07 марта 2012

Это может быть достигнуто с небольшим количеством волшебства, используя конкатенацию строк и функцию substr.Короче говоря, вот что вы хотите:

select substr('0000000000'||'1234', -10, 10)

Ниже приведено объяснение.

Во-первых, знайте, что оператор конкатенации строк SQLite - ||.

Мы начнем с того, что возьмем строку, равную значению, которое мы хотим вернуть.Например, если вы хотите вернуть число, которое всегда имеет длину 10 символов, и оставить его с добавлением 0 s, если оно короче, начните со строки из десяти 0 s.На это мы свяжем число, которое вы хотите вернуть.В нашем примере это «1234».Пока что у нас есть часть, которая выглядит следующим образом: '0000000000'||'1234'

Затем передайте все это в функцию substr. Согласно документации , вот как работает функция substr:

Функция substr (X, Y, Z) возвращает подстроку входной строки X, которая начинается с Y-йсимвол и который Z символов в длину.... Если Y отрицательный, то первый символ подстроки находится путем подсчета справа, а не слева.

Таким образом, если вы хотите, чтобы длина строки составляла 10 символов, передайте -10 в качестве параметра Y (чтобы начать отсчет справа, 10 символов назад) и передайте 10 в качестве параметра Z (чтобы получить всего 10 символов)).

11 голосов
/ 04 февраля 2011

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10) работ; замените '1234' номером вашего продукта любой длины <= 10. </p>

5 голосов
/ 19 июня 2018

Начиная с 3.8.3 (2014) Вы можете использовать printf как:

SELECT printf("%04d", product_number) AS product_number FROM table;

Измените 4 на столько цифр, сколько вам нужно. Это вернуло бы 0001 для product_number 1.

5 голосов
/ 06 ноября 2016

Я знаю, что это старый вопрос, но следующее проще:

--  zero-pad to 4 digits:
select substr('0000'||3,-4);

substr не требует длины, если вы выбираете до конца.

...