2017-05-05 63 views
2

我想在SQL中複製一個Python函數,但我很難從表和循環/迭代的角度考慮它。Python的itertools.combinations()的SQL版本

import itertools 
rangeStart = 1 
rangeEnd = 20 
rangeStep = 2 
outputSize = 3 

lst = range(rangeStart, rangeEnd, rangeStep) 

list = list(itertools.combinations(lst, outputSize)) 
print(len(list)) 

如何可以複製在SQL上述Python代碼的輸出,同時仍然允許用於輸入(以能夠配合到輸入字段中一個用戶接口)?

具體而言,輸出應該是排列,而不是組合。我基本上試圖從GUI中輸入一些輸入,他們在那裏輸入範圍(即0,20),值的類型(偶數,奇數或全部)以及輸出中每個元組的長度。輸出是一個被排序的元組列表,所以(1,2,3)是好的,(2,3,1)或(1,3,2)是不好的。元組的值也從左到右遞增,因此(2,4,6)是好的,但(6,4,2)不是。元組中的值也是唯一的,所以(4,4,6)不好。

+0

如果輸出應該是排列組合,然後你想要的'itertools.permutations',不'itertools.combinations' –

回答

1

使用遞歸cte從1到20生成奇數,然後使用一系列cross join s。

with t(val) as (select 1 union all select val+2 from t where val<19) 
select * 
from t t1 
cross join t t2 
cross join t t3 
where t1.val<t2.val and t2.val<t3.val 

這會在列表中生成當前以行形式存在的元組。

Sample Demo

+0

正是我一直在尋找的eqivalent!謝謝! – happyhippo83