您可以創建一個UDx Scalar Function
,它將檢查行級別上的相等性。您可以對元組進行排序或從元組中創建集合。我將在Python上展示一個例子,但強烈建議在JAVA或C++上編寫UDF。 (上youtube充分演示)
dbadmin=> select * from t1;
item1 | item2 | item3 | value
-------+-------+-------+-------
A | B | C | 3
C | D | E | 2
(2 rows)
dbadmin=> select * from t2;
item1 | item2 | item3
-------+-------+-------
C | A | B
C | F | E
(2 rows)
dbadmin=> select t1.* from t1, t2 where perm(t1.item1, t1.item2, t1.item3, t2.*);
item1 | item2 | item3 | value
-------+-------+-------+-------
A | B | C | 3
(1 row)
如果元組的次序是重要的:
dbadmin=> select t2.*, t1.value from t1, t2
dbadmin-> where perm(t1.item1, t1.item2, t1.item3, t2.*);
item1 | item2 | item3 | value
-------+-------+-------+-------
C | A | B | 3
(1 row)
例如有關python(對於Vertica的8.x中)
1版本:
def processBlock(self, server_interface, arg_reader, res_writer):
while(True):
cols = arg_reader.getNumCols()
if cols % 2 != 0:
raise ValueError("num of columns must be even")
s1, s2 = set(), set()
for i in range(cols):
if i < cols/2:
s1.add(arg_reader.getString(i))
else:
s2.add(arg_reader.getString(i))
res_writer.setBool(s1 == s2)
res_writer.next()
if not arg_reader.next():
break
版本2 :
def processBlock(self, server_interface, arg_reader, res_writer):
while(True):
cols = arg_reader.getNumCols()
if cols % 2 != 0:
raise ValueError("num of cols must be even")
s = set()
for i in range(cols):
s.add(arg_reader.getString(i))
res_writer.setBool(len(s) == cols/2)
res_writer.next()
if not arg_reader.next():
break
全碼:
import vertica_sdk
class perm(vertica_sdk.ScalarFunction):
def __init__(self):
pass
def setup(self, server_interface, col_types):
pass
def processBlock(self, server_interface, arg_reader, res_writer):
#server_interface.log("log msg")
while(True):
# Example of error checking best practices.
cols = arg_reader.getNumCols()
if cols % 2 != 0:
raise ValueError("num of cols must be even")
s = set()
for i in range(cols):
s.add(arg_reader.getString(i))
res_writer.setBool(len(s) == cols/2)
res_writer.next()
if not arg_reader.next():
break
def destroy(self, server_interface, col_types):
pass
class perm_factory(vertica_sdk.ScalarFunctionFactory):
def createScalarFunction(self, srv):
return perm()
def getPrototype(self, srv_interface, arg_types, return_type):
arg_types.addAny()
return_type.addBool()
def getReturnType(self, srv_interface, arg_types, return_type):
return_type.addBool()
固定列數?或者N可以大於3所示的例子? –
理想情況下,N會大於3 – valenzio