簡體   English   中英

沒有在 mysql 中修剪的 LPAD

[英]LPAD without trimming in 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,但是當我這樣做時,我使用它的前綴: CONCAT("PFX", LPAD(id,4,"0"))

感謝您的幫助

PS:如果我做錯了什么,請告訴我,這是我第一次在這里提問。

您可以對 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 []>

沒有 zerofill 你可以像這樣計算它:

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 []>

好吧,我在 LPAD 上遇到了類似的問題,它正在將數字截斷為其焊盤長度。 根據https://dev.mysql.com/doc/refman/8.0/en/string-functions.html#function_lpad這是預期的結果。

據我所知,沒有人提到解決我同樣問題的答案:

LPAD(id, GREATEST(LENGTH(id), 4), "0")

它按預期工作。 墊的任何id的短於4個字符與0,並且返回不變id的是比4個字符。

我將我的答案留給其他人,他們將來會發現這個問題。

問問自己,為什么一個數字需要前導零。 實踐和理論數學中的任何數字都不需要前導零。

也許您想可視化某些東西,而不是將結果作為實數處理。 在這種情況下,您可以在表ZEROFILL聲明該字段並選擇它轉換為字符: SELECT CONVERT(id, CHAR); .

除此之外,唯一的方法是混合使用CONCAT()LENGTH() ,這樣您就可以避免將 ID 剝離為LPAD()的值。

LPAD

您可以使用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,}量詞的貪婪設置為惰性。 這里需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM