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