您可以创建一个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