簡體   English   中英

MYSQL SUBSTRING_INDEX / CONVERT / IF子句

[英]MYSQL SUBSTRING_INDEX / CONVERT / IF clause

我有這樣的桌子。

abc-cde-0001222
abc-cde-0001223
abc-ced-0001224
cde-efg-0003001
ced-efg-0003002
ced-efg-0003008

我希望選擇abc-cde-0001222, abc-ced-0001224

        also cde-efg-0003001 , cde-efg-0003002

             ced-efg-0003008  , ""

看,我需要獲取范圍的第一個和最后一個值。 如果特定值只是一項(不在范圍內),我希望它選擇為第一值和空值。

到目前為止,我只有使用IFincrement operator的想法(如果可能的話)。 我可以使用以下格式進行格式化並獲取Int值

SELECT field, CONVERT(SUBSTRING_INDEX(field,'-',-1), UNSIGNED INTEGER) AS num
FROM table
ORDER BY num;

請你幫我一下...非常感謝

這是MySQL的痛苦。 但是,有可能。 邏輯是查找序列從何處開始。 您可以使用相關的子查詢和一些算法來做到這一點。 然后,您需要起點的累積總和。 這比較困難,因為它需要對相關子查詢執行相關子查詢。

首先,設置NullIfStart變量:

select t.*,
       (select 0
        from t t2
        where left(t2.field, 8) = left(t.field, 8) and
              t2.field < t.field and
              right(t2.field, 7) + 0 = right(t.field, 7) + 0 - 1
       ) as NullIfStart
from t;

這將獲取累積總和,可以將其用作分組字段:

select t.*
       (select sum(NullIfStart is null)
        from (select t1.*,
                     (select 0
                      from t t2
                      where left(t2.field, 8) = left(t1.field, 8) and
                            t2.field < t1.field and
                            right(t2.field, 7) + 0 = right(t1.field, 7) + 0 - 1
                     ) as NullIfStart
               from t t1
              ) tnis
         where right(tnis.field, 7) = right(t.field, 7) and
               tnis.field <= t.field
        ) grp
from t;

最終的解決方案是進行聚合:

select min(field),
       (case when max(field <> min(field) then max(field) end)
from (select t.*
             (select sum(NullIfStart is null)
              from (select t1.*,
                           (select 0
                            from t t2
                            where left(t2.field, 8) = left(t1.field, 8) and
                                  t2.field < t1.field and
                                  right(t2.field, 7) + 0 = right(t1.field, 7) + 0 - 1
                           ) as NullIfStart
                     from t t1
                    ) tnis
               where left(tnis.field, 8) = left(t.field, 8) and
                     tnis.field <= t.field
              ) grp
      from t
     ) s
group by left(s.field, 8), grp;

暫無
暫無

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

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