2017-02-02 5 views
0

У меня есть следующий запрос, извлеченный из вида netezza, так как нет записи о сохраненном исходном запросе. Как понять, что делает этот запрос?Как понять измененный запрос netezza?

CASE WHEN (O.E_SRC ~~LIKE_ESCAPE('FIX.%.OrderNew'::"VARCHAR", '\'::"VARCHAR")) 
     THEN ADMIN."REPLACE"(ADMIN."REPLACE"(O.E_SRC, '.OrderNew'::"VARCHAR", ''::"VARCHAR"), 
     'FIX.'::"VARCHAR", ''::"VARCHAR") 
    ELSE O.E_SRC 
    END AS CONNECTION_ID 

То, что я понял, там соответствующий шаблон на «FIX.%. OrderNew» и это какой-то заменить? Итак, каков будет исходный запрос? Как NVL(RNO,0) сохраняется как
CASE WHEN (RNO NOTNULL) THEN RNO WHEN (0 NOTNULL) THEN 0 ELSE NULL::INT4 END

Так что первоначальный эквивалентный запрос к nvl() или какой-либо другой функции следующего Netezza измененный запрос

CASE WHEN (O.E_SRC ~~LIKE_ESCAPE('FIX.%.OrderNew'::"VARCHAR", '\'::"VARCHAR")) 
     THEN ADMIN."REPLACE"(ADMIN."REPLACE"(O.E_SRC, '.OrderNew'::"VARCHAR", ''::"VARCHAR"), 
     'FIX.'::"VARCHAR", ''::"VARCHAR") 
    ELSE O.E_SRC 
    END AS CONNECTION_ID 

ответ

1

Зрения obfucscating исходный код, но не слишком плохо.

Если мы начнем с таблицы, как это:

select * from so_table; 

COL1  E_SRC    
------- ------------------ 
1  FIX.SCOTT.OrderNew 
2  BREAK.BOB.OrderOld 

и создать представление, как это:

create or replace view so_view as 
select 
case 
    when o.e_src like('FIX.%.OrderNew') 
    then replace(
     replace(o.e_src, '.OrderNew','') 
      ,'FIX.','') 
    ELSE o.e_src 
END as CONNECTION_ID 
from so_table o ; 

Затем мы можем проверить источник зрения, так как он хранится в каталоге:

SELECT 
    CASE WHEN (O.E_SRC ~~ LIKE_ESCAPE('FIX.%.OrderNew'::"VARCHAR", '\':: 
     "VARCHAR")) THEN ADMIN."REPLACE"(ADMIN."REPLACE"(O.E_SRC, 
     '.OrderNew'::"VARCHAR", 
     ''::"VARCHAR"), 
     'FIX.'::"VARCHAR", 
     ''::"VARCHAR") ELSE O.E_SRC END AS CONNECTION_ID 
FROM 
    ADMIN.SO_TABLE O; 

Из этого вы можете видеть, что он преобразует LIKE (с подразумеваемым символом «\») в другую формы, а также привязки к приведениям к каждому выражению.

select * from so_view; 

CONNECTION_ID  
------------------ 
BREAK.BOB.OrderOld 
SCOTT 

В этом случае тянет среднюю подстроку из строки, которая начинается с «FIX». и заканчивается на «.OrderNew», иначе он просто возвращает исходную строку.

+0

Вы гениальный человек .. Большое спасибо !!! Это исходит из опыта или есть какой-то конкретный способ понять это? –

+0

В основном просто опыт. Следует иметь в виду, что все, что хранится в определении представления, должно соответствовать эквиваленту того, что использовалось в инструкции CREATE VIEW. По большей части это означает косметические изменения (например, :: литье выражений), но может быть больше (например, изменение более простого LIKE для более сложного, но все же эквивалентного LIKE_ESCAPE. Рад, что я мог бы помочь! – ScottMcG