如何理解netezza修改过的查询?

时间:2017-02-02 16:00:12

标签: sql database 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 个答案:

答案 0 :(得分:1)

VIEW正在彰显原始代码,但并不是太糟糕。

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

 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'结尾,否则它只返回原始字符串。