在sql查询中自动增加varchar

时间:2015-08-07 09:12:03

标签: php mysql

我正在尝试从表中自动增加varchar列。它是" PU"的前缀。我使用它来获取最后一个数字并将其递增一个。

我在下面尝试了这个查询:

SELECT 
CONCAT(
LEFT( BARCODE, 2 ) 
, 
MAX( 
RIGHT( BARCODE, LENGTH(BARCODE)-2 ) 
* 1 )
+1 
) 
as newbarcode FROM KGU WHERE HW_TYPE='STANDARD PURGE UNIT';

最后一个条形码是PU0000012。它返回一个PU13。它删除了0。

所以我尝试将其替换为:

LEFT( BARCODE, 7 ) 

它返回PU0000013,这是正确的。但是假设我把PU1234567作为最后一个条目。它返回:PU000001234568。

有什么建议吗?我正在使用php btw。如果一个选项是使用PHP我很开放。但是如果可能的话,我更喜欢在sql查询中解决它。

3 个答案:

答案 0 :(得分:3)

试试这个:

<?php
// fetch the very last entry

$Barcode = 'PU000001234567';

preg_match("/(\D+)(\d+)/", $Barcode, $Matches); // Matches the PU and number

$ProductCode = $Matches[1];

$NewID = intval($Matches[2]);
$NewID++;


$BarcodeLength = 12;
$CurrentLength = strlen($NewID);
$MissingZeros = $BarcodeLength - $CurrentLength;

for ($i=0; $i<$MissingZeros; $i++) $NewID = "0" . $NewID;

$Result = $ProductCode . $NewID;

echo $Result;

// insert into database with $Result
  

返回:PU000001234568

答案 1 :(得分:1)

尝试以下查询 -

SELECT CONCAT(LEFT(BARCODE, 2),LPAD(@n := @n + 1,7,0)) AS newbarcode 
FROM KGU AS a
JOIN (SELECT @n := 13) AS m
WHERE HW_TYPE='STANDARD PURGE UNIT';

答案 2 :(得分:0)

我假设您的条形码基本上是INT(7) UNSIGNED ZEROFILL,前缀为VARCHAR

为了将此作为首选SQL解决方案保留为首选,我只创建了一个MySQL函数。诀窍是将条形码的数字部分视为无符号零填充整数 - 这样可以保持领先的零点。

CREATE FUNCTION `barcode_increment`(`sin_barcode` VARCHAR(12), `sin_prefix` VARCHAR(5)) RETURNS varchar(12)
    READS SQL DATA
    DETERMINISTIC
    COMMENT 'increments a barcode that has a prefix'
BEGIN   
    DECLARE i_barcode_num INT(7) UNSIGNED ZEROFILL;
    SET i_barcode_num = CAST(REPLACE(sin_barcode, sin_prefix, '') AS UNSIGNED);
    SET i_barcode_num = i_barcode_num + 1;

    RETURN CONCAT(sin_prefix, i_barcode_num);
END

然后,您可以通过标准SQL查询调用此函数,如下所示:

SELECT barcode_increment('PU0000012', 'PU') AS new_barcode

这将为您提供 PU0000013

注意:如果 PU 始终是前缀,您只需在函数本身中声明并设置它 - 无需将其作为参数传递。 < / p>

或者你可以在一个(略微凌乱的)查询中执行此操作,该查询依赖于LPAD而不是ZEROFILL

SELECT CONCAT('PU', LPAD(CAST(REPLACE('PU0001234', 'PU', '') AS UNSIGNED) + 1, 7, 0))

该示例将为您提供 PU0001235