1*49cb8d73SstephanWITH RECURSIVE 2*49cb8d73Sstephan input(sud) AS ( 3*49cb8d73Sstephan VALUES('53..7....6..195....98....6.8...6...34..8.3..17...2...6.6....28....419..5....8..79') 4*49cb8d73Sstephan ), 5*49cb8d73Sstephan digits(z, lp) AS ( 6*49cb8d73Sstephan VALUES('1', 1) 7*49cb8d73Sstephan UNION ALL SELECT 8*49cb8d73Sstephan CAST(lp+1 AS TEXT), lp+1 FROM digits WHERE lp<9 9*49cb8d73Sstephan ), 10*49cb8d73Sstephan x(s, ind) AS ( 11*49cb8d73Sstephan SELECT sud, instr(sud, '.') FROM input 12*49cb8d73Sstephan UNION ALL 13*49cb8d73Sstephan SELECT 14*49cb8d73Sstephan substr(s, 1, ind-1) || z || substr(s, ind+1), 15*49cb8d73Sstephan instr( substr(s, 1, ind-1) || z || substr(s, ind+1), '.' ) 16*49cb8d73Sstephan FROM x, digits AS z 17*49cb8d73Sstephan WHERE ind>0 18*49cb8d73Sstephan AND NOT EXISTS ( 19*49cb8d73Sstephan SELECT 1 20*49cb8d73Sstephan FROM digits AS lp 21*49cb8d73Sstephan WHERE z.z = substr(s, ((ind-1)/9)*9 + lp, 1) 22*49cb8d73Sstephan OR z.z = substr(s, ((ind-1)%9) + (lp-1)*9 + 1, 1) 23*49cb8d73Sstephan OR z.z = substr(s, (((ind-1)/3) % 3) * 3 24*49cb8d73Sstephan + ((ind-1)/27) * 27 + lp 25*49cb8d73Sstephan + ((lp-1) / 3) * 6, 1) 26*49cb8d73Sstephan ) 27*49cb8d73Sstephan ) 28*49cb8d73SstephanSELECT s FROM x WHERE ind=0; 29