MYSQL查询查找值

时间:2014-02-01 11:56:48

标签: mysql

我有一个名为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

3 个答案:

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

这听起来像是一个自动增量问题。我认为从效率原因来看,最好添加插入\更新日期列和另一行自动增量值。

插入时的另一个选项是根据表格中的行数提取此数字,但我看到可能会出现使用此选项可能出现的问题。