我的公司在SQL Server中具有生产和测试数据库,在IBM Netezza中具有数据仓库。我在SQL Server中编写了一个查询,现在需要对其进行隐秘处理才能在数据仓库中使用,但是我遇到了问题。
查询的关键部分是从路径中提取文件名,在SQL Server中,我使用此名称:
RIGHT( BitmapID, CHARINDEX( '\', REVERSE( BitmapID ) + '\' ) - 1 )
这会将“ G:\ grps \ every \ Permanent Marketing Signage \ SPC \ BRD \ BLAD \ BCAG_BLAD_001.png”更改为“ BCAG_BLAD_001.png”,并且效果很好。我试图将其转换为Netezza语法,如下所示:
SUBSTRING(bit_map_ID, LENGTH(bit_map_ID) - ( STRPOS( REVERSE( bit_map_ID ), '\' ) + 2 ) )
但是,当我运行它时,出现错误:
错误[42S02]错误:函数'REVERSE(VARCHAR)'不存在 无法识别满足给定参数类型的函数 您可能需要添加显式的类型转换
当我用反向字符串示例(例如“ gnp.100_DALB_GACB \ DALB \ DRB \ CPS \ egangiS gnitekraM tnenamreP \ yreve \ sprg:G”)替换REVERSE(bit_map_ID)时,这也很好用,因此问题在于REVERSE函数。即使Aginity Workbench突出显示了REVERSE函数,即使它似乎存在,也似乎根本不起作用-或有某种方法可以使它起作用,但我无法弄清楚。我已经尝试过按照错误消息的建议使用CAST,但这没什么区别。
是否可以在Netezza中反转字符串?还是失败了,还有其他方法可以完成我想做的事情而无需反转字符串吗?
答案 0 :(得分:0)
我能够弄清楚如何在Netezza中做到这一点,而无需使用如下的REVERSE函数:
2018-08-02 18:02:00-04:00 196.66
2018-08-02 18:04:00-04:00 393.27
2018-08-02 18:06:00-04:00 393.22
2018-08-02 18:08:00-04:00 393.22
2018-08-02 18:10:00-04:00 393.22
2018-08-02 18:12:00-04:00 196.60
关键是使用INSTR函数并将第三个参数指定为-1,以便它将从字符串的末尾而不是字符串的开头查找第一个实例。无需换向。
虽然这可以满足我的需求,但我肯定会愿意回答我提出的问题!
答案 1 :(得分:0)
据我所知,netezza上不存在REVERSE功能,而上述错误消息确实如此,因此我可以确认您提供的解决方案是可行的。 替代解决方案是使用正则表达式函数或字符串拆分。 据我所知,MSsql服务器没有这三种解决方案可用,而您真正的问题可能是SQL标准不包括需要遵从的功能列表,因此每个数据库都有自己的功能,包括和它们的接口是什么(instr的负参数未被普遍接受)