用于格式化前导零的数字的SQLite函数?

时间:2011-02-04 15:41:00

标签: sqlite formatting numbers leading-zero

我有一个需要包含产品的SQLite数据库。这些产品具有固定格式的复合产品编号,包括类别,组和产品编号(cccccc.gg.ppp)。每次插入新产品时,都应使用类别和组编号构建新产品编号,然后使用该编号增加1中的最高产品编号。

为此,我考虑将所有三个数字存储在单独的字段中,并使用视图动态组合产品编号。为了实现这一点,我需要添加前导零,因为产品编号的格式是固定的。

但是,我似乎无法找到一个内置的SQLite函数,它可以让我这样做......: - (

我宁愿不编写自定义函数,因为我们可能需要与其他开发人员共享数据库,以便他们从中读取数据;我不知道他们将使用什么平台或语言。

可以这样做吗?或者我们必须找到不同的解决方案吗?

4 个答案:

答案 0 :(得分:56)

这可以通过使用字符串连接和substr函数进行一些魔术来实现。长话短说,这就是你想要的:

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

接下来是一个解释。

首先,要知道SQLite的字符串连接运算符是||

我们将从一个与我们想要返回的值一样长的字符串开始。例如,如果要返回一个总是10个字符长的数字,如果它更短,则用0 s填充它,然后以10 0 s的字符串开头。为此,我们将连接您想要返回的数字。在我们的例子中,那是'1234'。到目前为止,我们的部分看起来像这样:'0000000000'||'1234'

然后,将整个内容传递给substr函数。 According to the documentation,以下是substr函数的工作原理:

substr(X,Y,Z)函数返回输入字符串X的子字符串,该字符串以第Y个字符开头,长度为Z个字符。 ...如果Y为负数,则通过从右侧而不是左侧计数来找到子串的第一个字符。

因此,如果您希望字符串长度为10个字符,则将-10作为Y参数(从右侧开始计数,返回10个字符)并将10作为Z参数传递(总计10个字符)。< / p>

答案 1 :(得分:11)

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)有效;将'1234'替换为您的产品编号,任何长度&lt; = 10.

答案 2 :(得分:5)

我知道这是一个老问题,但以下内容更简单:

substr
如果你选择到最后,

{{1}}不需要长度。

答案 3 :(得分:4)

从3.8.3版(2014年开始)开始,您可以将printf用作:

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

将4更改为所需的位数。对于product_number 1,这将返回0001。