[英]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()
的值。
您可以使用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.