Netezza 中的 REVERSE 函数不起作用,如何在没有它的情况下从路径中提取文件名?
REVERSE function in Netezza not working, how to extract file name from path without it?
我的公司在 SQL Server 中有生产和测试数据库,在 IBM Netezza 中有一个数据仓库。我在 SQL 服务器中编写了一个查询,现在需要将其隐藏以便在数据仓库中使用,但是我 运行 遇到了一个问题。
查询的一个关键部分是从路径中提取文件名,在 SQL 服务器中我使用这个:
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 ) )
然而,当我运行这个时,我得到一个错误:
ERROR [42S02] ERROR: Function 'REVERSE(VARCHAR)' does not exist
Unable to identify a function that satisfies the given argument types
You may need to add explicit typecasts
当我将 REVERSE( bit_map_ID ) 替换为 "gnp.100_DALB_GACB\DALB\DRB\CPS\egangiS gnitekraM tnenamreP\yreve\sprg:G" 之类的反向字符串示例时,这也可以完美运行,因此问题出在 REVERSE 函数上。尽管 Aginity Workbench 突出显示了 REVERSE 函数,就好像它存在一样,但它似乎根本不起作用——或者如果有办法让它起作用,我也想不通。我已经按照错误消息的建议尝试使用 CAST,但没有任何区别。
有没有办法在 Netezza 中反转字符串?或者失败了,有没有其他方法可以在不反转字符串的情况下完成我想做的事情?
我能够弄清楚如何在 Netezza 中执行此操作,而无需像这样使用 REVERSE 函数:
SUBSTRING( bit_map_ID, INSTR( bit_map_ID, '\', -1 ) + 1 )
关键是使用INSTR函数并将第三个参数指定为-1,这样它就会从字符串的结尾而不是字符串的开头查找第一个实例。不需要倒车。
虽然这符合我的需要,但对于我提出的问题,我绝对愿意接受其他答案!
据我所知,netezza 上不存在 REVERSE 函数,这确实是上面的错误消息所说的,因此我可以确认您提供的解决方案是可行的。
替代解决方案是使用正则表达式函数或字符串拆分。
据我所知,MSsql 服务器有这 3 个解决方案中的 none 个可用,对您来说真正的问题可能是 SQL 标准不包含需要兼容的函数列表,因此每个数据库都有其自己决定要包含哪些函数以及它们的接口是什么(对 instr 的否定参数未被普遍接受)
我的公司在 SQL Server 中有生产和测试数据库,在 IBM Netezza 中有一个数据仓库。我在 SQL 服务器中编写了一个查询,现在需要将其隐藏以便在数据仓库中使用,但是我 运行 遇到了一个问题。
查询的一个关键部分是从路径中提取文件名,在 SQL 服务器中我使用这个:
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 ) )
然而,当我运行这个时,我得到一个错误:
ERROR [42S02] ERROR: Function 'REVERSE(VARCHAR)' does not exist Unable to identify a function that satisfies the given argument types You may need to add explicit typecasts
当我将 REVERSE( bit_map_ID ) 替换为 "gnp.100_DALB_GACB\DALB\DRB\CPS\egangiS gnitekraM tnenamreP\yreve\sprg:G" 之类的反向字符串示例时,这也可以完美运行,因此问题出在 REVERSE 函数上。尽管 Aginity Workbench 突出显示了 REVERSE 函数,就好像它存在一样,但它似乎根本不起作用——或者如果有办法让它起作用,我也想不通。我已经按照错误消息的建议尝试使用 CAST,但没有任何区别。
有没有办法在 Netezza 中反转字符串?或者失败了,有没有其他方法可以在不反转字符串的情况下完成我想做的事情?
我能够弄清楚如何在 Netezza 中执行此操作,而无需像这样使用 REVERSE 函数:
SUBSTRING( bit_map_ID, INSTR( bit_map_ID, '\', -1 ) + 1 )
关键是使用INSTR函数并将第三个参数指定为-1,这样它就会从字符串的结尾而不是字符串的开头查找第一个实例。不需要倒车。
虽然这符合我的需要,但对于我提出的问题,我绝对愿意接受其他答案!
据我所知,netezza 上不存在 REVERSE 函数,这确实是上面的错误消息所说的,因此我可以确认您提供的解决方案是可行的。 替代解决方案是使用正则表达式函数或字符串拆分。 据我所知,MSsql 服务器有这 3 个解决方案中的 none 个可用,对您来说真正的问题可能是 SQL 标准不包含需要兼容的函数列表,因此每个数据库都有其自己决定要包含哪些函数以及它们的接口是什么(对 instr 的否定参数未被普遍接受)