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()
是否有使用 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()