我试图找到一种方法,在ID的开头添加0而不进行修整:
我目前正在使用LPAD(id,4,"0")
女巫,直到9999
为止
SELECT LPAD(12345,4,"0");
12345
1234
我正在寻找执行LPAD(id, MAX(LENGTH(id),4), "0")
我找到了SELECT IF(LENGTH(12345)>4, 12345, LPAD(12345, 4, "0"));
,但我更希望4
位于单个位置(以便更容易在其他地方使用)。
MAX()
的替代方法吗?IF(LENGTH)
解决方案,这是缺点吗?编辑:
ZEROFILL
不符合我的需求,因为我还需要没有0
的id。
我主要使用不带LPAD()
的ID,但是当我使用ID时,会使用前缀CONCAT("PFX", LPAD(id,4,"0"))
感谢您的帮助
PS:请告诉我我做错了什么,这是我第一次在这里问。
答案 0 :(得分:2)
好吧,我在 LPAD 上遇到了类似的问题,它将数字截断为其焊盘长度。根据 https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_lpad 这是预期的结果。
据我所知,没有人提到解决了我同样问题的答案:
LPAD(id, GREATEST(LENGTH(id), 4), "0")
它按预期工作。用 0 填充任何短于 4 个字符的 id
,并返回长于 4 个字符的未改变的 id
。
我将我的答案留给其他人,他们将来会发现这个问题。
答案 1 :(得分:1)
问自己,为什么一个数字根本需要前导零。在实践和理论数学中,没有数字需要前导零。
也许您想可视化某些内容,而不将结果作为实数使用。
在这种情况下,您可以在表ZEROFILL
中声明该字段,然后选择将其转换为char:SELECT CONVERT(id, CHAR);
。
除此之外,唯一的方法是将CONCAT()
和LENGTH()
混合使用,这样可以避免将ID剥离为LPAD()
中的值。
答案 2 :(得分:1)
您可以设置int字段的长度,也可以这样设置zerofill:
CREATE TABLE `num` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`Numbers` int(5) unsigned zerofill DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
插入值:
INSERT INTO `num` (`id`, `Numbers`)
VALUES
(1, 1),
(2, 22),
(3, 123456);
查看结果:
MariaDB []> select * from num;
+----+---------+
| id | Numbers |
+----+---------+
| 1 | 00001 |
| 2 | 00022 |
| 3 | 123456 |
+----+---------+
3 rows in set (0.000 sec)
MariaDB []>
没有填零,您可以像这样计算:
SELECT
id,
SUBSTRING( CONCAT('000000',Numbers),- GREATEST(LENGTH(Numbers),5))
FROM num;
结果:
MariaDB []> SELECT
-> id,
-> SUBSTRING( CONCAT('000000',Numbers),- GREATEST(LENGTH(Numbers),5))
-> FROM num;
+----+--------------------------------------------------------------------+
| id | SUBSTRING( CONCAT('000000',Numbers),- GREATEST(LENGTH(Numbers),5)) |
+----+--------------------------------------------------------------------+
| 1 | 00001 |
| 2 | 00022 |
| 3 | 123456 |
+----+--------------------------------------------------------------------+
3 rows in set (0.001 sec)
MariaDB []>
答案 3 :(得分:0)
您可以使用REGEXP_REPLACE
来做到这一点,以等效LPAD
的方式执行,但不会截断结果。如果您希望最小长度为4,填充长度为0,则可以执行以下操作:
REGEXP_REPLACE(CONCAT('0000', id), '^0{0,4}(.{4,})$', '\\1')
您可以通过将'0000'
替换为REPEAT('0', 4)
来以编程方式进行调整。这种方法的主要优点是不重复填充的内容。在我的用例中,我可能会遇到很长且很复杂的事情,我不想重复这些事情以仅填充它们,因此此代码片段可以完成工作。
对于RPAD
有问题的人,您需要一个非常紧密的模式:
REGEXP_REPLACE(CONCAT(id, '0000'), '^(.{4,}?)0{0,4}$', '\\1')
该模式中的两个块实际上是倒置的,但是您可以看到.{4,}?
而不是.{4,}
。这是为了将{4,}
量词的贪婪程度设置为懒惰。这里需要它。