set search_path='tmp';
WITH ztab AS (
SELECT idx as idx
, substring ('WTF!' FROM idx FOR 1) as str
FROM generate_series(1, char_length('WTF!')) idx
)
SELECT t1.str, t2.str
FROM ztab t1
JOIN ztab t2 ON t2.idx > t1.idx
;
Risultato:
str | str
-----+-----
W | T
W | F
W | !
T | F
T | !
F | !
(6 rows)
Purtroppo non riesco a trovare un modo per evitare la doppia stringa costante. (ma l'intera cosa può essere impacchettata in una funzione) Se non ci sono caratteri duplicati (o se si desidera supprutarli) si potrebbe fare l'anti-join sullo str invece dell'idx.
UPDATE (suggerimento da ypercube) Sembra che l'OP desideri che le stringhe siano concatenate. Così sia ::
WITH ztab AS (
SELECT idx as idx
, substring ('WTF!' FROM idx FOR 1) as str
FROM generate_series(1, char_length('WTF!')) idx
)
SELECT t1.str || t2.str AS results
FROM ztab t1
JOIN ztab t2 ON t2.idx > t1.idx
;
Risultati:
results
---------
WT
WF
W!
TF
T!
F!
(6 rows)
Update2: (qui viene il thingy ricorsiva ...)
WITH RECURSIVE xtab AS (
WITH no_cte AS (
SELECT
1::int AS len
, idx as idx
, substring ('WTF!' FROM idx FOR 1) as str
FROM generate_series(1, char_length('WTF!')) idx
)
SELECT t0.len as len
, t0.idx
, t0.str
FROM no_cte t0
UNION SELECT 1+t1.len
, tc.idx
, t1.str || tc.str AS str
FROM xtab t1
JOIN no_cte tc ON tc.idx > t1.idx
)
SELECT * FROM xtab
ORDER BY len, str
-- WHERE len=2
;
Risultati 3:
len | idx | str
-----+-----+------
1 | 4 | !
1 | 3 | F
1 | 2 | T
1 | 1 | W
2 | 4 | F!
2 | 4 | T!
2 | 3 | TF
2 | 4 | W!
2 | 3 | WF
2 | 2 | WT
3 | 4 | TF!
3 | 4 | WF!
3 | 4 | WT!
3 | 3 | WTF
4 | 4 | WTF!
(15 rows)
Perché l'hai fatto in un DBMS? Non puoi farlo a livello di applicazione? –
Potrei essere utile in un risolutore di sudoku ;-) – wildplasser
Lo userei in più linguaggi di programmazione e solo un database PostgreSQL, quindi stavo pensando che questo sarebbe stato il modo più semplice per avere questo in un unico posto. Questo non deve essere unito a una stringa, ho appena dato sugestione come dovrebbe funzionare. – ffox003