我有一个名为PO_JOBS
的表,其中包含一个名为PO_NUMBER
的列。该值应采用PO_2014_JAN_1
格式(带有PO_的前缀,当前年份,三个月份的字母,最后一个值递增)。
例如,
每个月的PO_Numbers是
PO_2014_JAN_1
PO_2014_JAN_2
....
PO_2014_FEB_1
PO_2014_FEB_2
...
PO_2015_JAN_1
....
我试过这个
SELECT
CONCAT(('PO_'),
YEAR(CURRENT_TIMESTAMP),
'_',
SUBSTRING(UPPER(MONTHNAME(CURRENT_TIMESTAMP)),1,3),
'_',
IF(
LOCATE(
CONCAT(YEAR(CURRENT_TIMESTAMP),
'_',
SUBSTRING(UPPER(MONTHNAME(CURRENT_TIMESTAMP)),1,3)),
PO_NUMBER)>0,
MAX(CAST(SUBSTRING(PO_NUMBER,13) AS UNSIGNED))+1,
1))
FROM PO_JOBS
但它不会增加值(即)总是返回1(PO_2014_FEB_1
)。我希望你理解我的问题。
我的目标是根据PO_NUMBER
PO_current year_Three letters of current month_incremented value
答案 0 :(得分:1)
尝试以下查询:
set @prefix := concat('PO_', year(current_timestamp),'_', SUBSTRING(UPPER(MONTHNAME(CURRENT_TIMESTAMP)),1,3), '_');
SELECT concat(@prefix, IFNULL(max(number), 0) + 1) AS next FROM
(
SELECT CAST( replace(PO_NUMBER,@prefix,'') AS UNSIGNED ) AS number
FROM PO_JOBS WHERE PO_NUMBER LIKE concat(@prefix,'%')
) AS numbers
答案 1 :(得分:1)
我通过以下查询解决了这个问题。感谢vadaica's helpful answer
SELECT
CONCAT(
('PO_'),
YEAR(CURRENT_TIMESTAMP),
'_',
SUBSTRING(UPPER(MONTHNAME(CURRENT_TIMESTAMP)),1,3),
'_',
IFNULL(MAX(CAST(
replace(PO_NUMBER,
concat('PO_',
year(current_timestamp),
'_',
SUBSTRING(UPPER(MONTHNAME(CURRENT_TIMESTAMP)),1,3),
'_'),'') AS UNSIGNED ))
+1,1)) AS number
from po_jobs
答案 2 :(得分:0)
这听起来像是一个自动增量问题。我认为从效率原因来看,最好添加插入\更新日期列和另一行自动增量值。
插入时的另一个选项是根据表格中的行数提取此数字,但我看到可能会出现使用此选项可能出现的问题。