31

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

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

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

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

这可以做到吗?还是我们必须找到不同的解决方案?

4

4 回答 4

80

这可以通过使用字符串连接和substr函数的一点魔法来完成。长话短说,这就是你想要的:

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

下面是一个解释。

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

我们将从一个与我们想要返回的值一样长的字符串开始。例如,如果您想返回一个长度始终为 10 个字符的数字,并且0如果它更短则用 s 填充,那么从一个 10 个0s 的字符串开始。为此,我们将连接您要返回的数字。在我们的示例中,即为“1234”。到目前为止,我们的部分看起来像这样:'0000000000'||'1234'

然后,将整个内容传递给substr函数。根据文档,这是该substr功能的工作原理:

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

因此,如果您希望字符串长度为 10 个字符,请将 -10 作为 Y 参数传递(从右侧开始计数,向后 10 个字符)并将 10 作为 Z 参数传递(总共取 10 个字符)。

于 2012-03-07T14:22:08.240 回答
20

自 3.8.3 (2014) 起,您可以将printf用作:

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

将 4 更改为您需要的任意位数。这将为 product_number 1 返回 0001。

于 2018-06-19T16:00:36.513 回答
16

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

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

substr如果您选择到最后,则不需要长度。

于 2016-11-06T01:34:02.470 回答
12

select substr('0000000000'||'1234', length('0000000000'||'1234')-9, 10)作品; 替换'1234'为您的产品编号,任何长度 <= 10。

于 2011-02-04T16:12:17.010 回答