无需在mysql中进行修整的LPAD

时间:2019-02-27 15:33:37

标签: mysql

我试图找到一种方法,在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:请告诉我我做错了什么,这是我第一次在这里问。

4 个答案:

答案 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)

LPAD

您可以使用REGEXP_REPLACE来做到这一点,以等效LPAD的方式执行,但不会截断结果。如果您希望最小长度为4,填充长度为0,则可以执行以下操作:

REGEXP_REPLACE(CONCAT('0000', id), '^0{0,4}(.{4,})$', '\\1')

您可以通过将'0000'替换为REPEAT('0', 4)来以编程方式进行调整。这种方法的主要优点是不重复填充的内容。在我的用例中,我可能会遇到很长且很复杂的事情,我不想重复这些事情以仅填充它们,因此此代码片段可以完成工作。

RPAD

对于RPAD有问题的人,您需要一个非常紧密的模式:

REGEXP_REPLACE(CONCAT(id, '0000'), '^(.{4,}?)0{0,4}$', '\\1')

该模式中的两个块实际上是倒置的,但是您可以看到.{4,}?而不是.{4,}。这是为了将{4,}量词的贪婪程度设置为懒惰。这里需要它。