Как избежать оператора CTQ в DB2 Blu с substr? - PullRequest
0 голосов
/ 20 февраля 2020

Я работаю с DB2 Blu, и у меня часто возникают проблемы в плане запросов с SUBSTR, поскольку оператор CTQ недостаточно высок.

Вот пример:

select
coalesce(annee,annee_semaine),
count(JOUR_OUVRE)
from d_tps_calendrier
group by grouping sets((annee),(annee_semaine))

С планом запроса все в порядке:

Rows 
            RETURN
            (   1)
             Cost 
              I/O 
              |
             2701 
            L   TQ
            (   2)
            334.257 
              224 
              |
             2701 
              C TQ
            (   3)
            333.573 
              224 
              |
             2701 
            UNION 
            (   4)
            332.721 
              224 
            /-+--\
         2649      52 
        GRPBY    GRPBY 
        (   5)   (  10)
        166.197  166.107 
          112      112 
          |        |
         22310    22310 
        TBSCAN   TBSCAN
        (   6)   (  11)
        165.176  165.176 
          112      112 
          |        |
         22310    22310 
        TEMP     TEMP  
        (   7)   (   7)
        147.121  147.121 
          112      112 
          |
         22310 
        GRPBY 
        (   8)
        134.404 
          112 
          |
         22310 
        TBSCAN
        (   9)
        132.702 
          112 
          |
         22310 
  CO-TABLE: INFIFZ00
 D_TPS_CALENDRIER_INF
          Q1

Теперь, что я действительно хочу сделать, это группа по первым 3 символам annee_semaine:

select
coalesce(annee,substr(annee_semaine,1,3)),
count(JOUR_OUVRE)
from d_tps_calendrier
group by grouping sets((annee),(substr(annee_semaine,1,3)))

А теперь в запросе plan, group by и union выполняются после оператора CTQ

Rows 
            RETURN
            (   1)
             Cost 
              I/O 
              |
             2701 
            UNION 
            (   2)
            431.235 
              224 
            /-+--\
         2649      52 
        GRPBY    GRPBY 
        (   3)   (  14)
        220.453  210.366 
          112      112 
          |        |
         2649     22310 
        TBSCAN   TBSCAN
        (   4)   (  15)
        220.219  208.372 
          112      112 
          |        |
         2649     22310 
        SORT     TEMP  
        (   5)   (   7)
        220.219  190.317 
          112      112 
          |
         22310 
        TBSCAN
        (   6)
        208.372 
          112 
          |
         22310 
        TEMP  
        (   7)
        190.317 
          112 
          |
         22310 
        LM  TQ
        (   8)
        181.039 
          112 
          |
         22310 
        GRPBY 
        (   9)
        165.712 
          112 
          |
         22310 
        TBSCAN
        (  10)
        163.749 
          112 
          |
         22310 
        SORT  
        (  11)
        161.817 
          112 
          |
         22310 
          C TQ
        (  12)
        132.866 
          112 
          |
         22310 
        TBSCAN
        (  13)
        132.702 
          112 
          |
         22310 
  CO-TABLE: INFIFZ00
 D_TPS_CALENDRIER_INF
          Q1

Я пытался использовать left вместо substr, но безуспешно. Есть ли хорошая практика для работы с substr в DB2 Blu?

В других случаях мне удалось напрямую поместить de substr в один столбец таблицы, но в этом случае это невозможно.

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Это сделал трюк:

select
coalesce(annee,cast(annee_semaine as vargraphic(3))),
count(JOUR_OUVRE)
from d_tps_calendrier
group by grouping sets((annee),(cast(annee_semaine as vargraphic(3))))

Он не идеален, так как работает только до тех пор, пока я хочу иметь первые символы, а не что-то вроде substr (str, 4,5)

0 голосов
/ 20 февраля 2020

Один из вариантов - добавить столбец в таблицу, которая генерируется всегда, например:

annee_semaine3 char(3) generated always as (substring(annee_semaine,1,3)) implicitly hidden

Затем вы можете сгруппировать по этому скрытому столбцу.

select
coalesce(annee,substr(annee_semaine,1,3)),
count(JOUR_OUVRE)
from d_tps_calendrier
group by grouping sets((annee),(annee_semaine3))

Вы можете также явно указывайте на него в предложении select, чтобы избежать этого вычисления.

Поскольку столбец скрыт, такие операции, как select *, не будут включать его; оно должно быть явно названо.

...