如何理解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 原始字符串。
我从 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 原始字符串。