Vertica:将 Bitstrint 转换为整数

Vertica: Convert Bitstrint to integer

是否有使用 vertica 将二进制字符串转换为整数的简单方法 sql?

像这样:

=> SELECT bitstring_to_int('11') as temp
 temp
---
 3

我知道有 bitstring_to_binary 但我也无法将二进制值转换为整数。

谢谢

基本上有两种解决方案(不幸的是两者都不是直截了当的): 1st:写一个SQL函数,根据位长需要扩展(例子有8位)

CREATE OR REPLACE FUNCTION bitstring_to_int(bs VARCHAR)
RETURN INTEGER
AS BEGIN
    RETURN (
        CASE WHEN SUBSTR(RIGHT('0'||bs, 1), 1, 1) = '1' THEN 1 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 2), 1, 1) = '1' THEN 2 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 3), 1, 1) = '1' THEN 4 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 4), 1, 1) = '1' THEN 8 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 5), 1, 1) = '1' THEN 16 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 6), 1, 1) = '1' THEN 32 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 7), 1, 1) = '1' THEN 64 ELSE 0 END + 
        CASE WHEN SUBSTR(RIGHT('0'||bs, 8), 1, 1) = '1' THEN 128 ELSE 0 END 
    ) ;
    END ;

或者在Python中写一个UDF:

import vertica_sdk

class bitstring_to_int(vertica_sdk.ScalarFunction):
    def processBlock(self, server_interface, arg_reader, res_writer):
        while(True):
            bs = arg_reader.getString(0)
            res_writer.setInt(sum([int(character) * 2 ** index \
                              for index,character in enumerate(str(bs)[::-1])]))
            res_writer.next()
            if not arg_reader.next():
                break
    def destroy(self, server_interface, col_types):
        pass

class bitstring_to_int_factory(vertica_sdk.ScalarFunctionFactory):
    def createScalarFunction(self, srv):
        return bitstring_to_int()
    def getPrototype(self, srv_interface, arg_types, return_type):
        arg_types.addVarchar()
        return_type.addInt()
    def getReturnType(self, srv_interface, arg_types, return_type):
        return_type.addInt()