如何理解netezza修改查询?

How to understand netezza modified query?

我从 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

VIEW 混淆了原始代码,但不是太严重。

如果我们从这样的 table 开始:

 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' 结尾的字符串中拉出中间子字符串,否则它只是 returns 原始字符串。