Das andere Beste aus zwei Welten

Wie ich schon irgendwie erwartet hatte, gefiel Uwe meine Regex-SQL-Mischung nicht.

Mit seiner Erlaubnis veröffentliche ich im Folgenden seinen (von mir reparierten 🙂 ) Gegenvorschlag:

select pers_name, sp_id, max(strikesequence) as strikesinarow from
( select *,
        length(
            unnest(
                string_to_array(
                    regexp_replace(
                        regexp_replace(
                            concat(
                                spiel.sp_w01_1, ',',
                                spiel.sp_w02_1 , ',',
                                spiel.sp_w03_1 , ',',
                                spiel.sp_w04_1 , ',',
                                spiel.sp_w05_1 , ',',
                                spiel.sp_w06_1 , ',',
                                spiel.sp_w07_1 , ',',
                                spiel.sp_w08_1 , ',',
                                spiel.sp_w09_1 , ',',
                                spiel.sp_w10_1 , ',',
                                spiel.sp_w10_2 , ',',
                                spiel.sp_w10_3 , ','
                            ), '10,', 'X', 'g'
                        ), '[^X]+', '-', 'g'
                    ), '-'
                )
            )
        ) as strikesequence
    from spiel natural join person
) as sub
group by pers_name, sp_id
order by pers_name, strikesinarow desc; 

Sein Ansatz ist definitiv kürzer und beim tippen deutlich weniger fehleranfällig, dafür aber IMHO nicht ganz so leicht nachvollziehbar.

Unbestritten sollte jedoch sein, dass weder seine noch meine Lösung in Produktivsystemen eingesetzt werden sollten…