TB16 behöver inte mer hjälp
TB16 182 – Fd. Medlem
Postad: 20 maj 2019 23:34 Redigerad: 20 maj 2019 23:35

PostGreSQL - regex extraction

Uppgift:

Input
You'll have a table like the following:

name                                                          greeting
Austin Gaylord                                          Hola que tal #4702665
Kacie Zulauf                                                Bienvenido 45454545 tal #470815 BD. WA470815

Output
In this practice you'll need to extract from the greeting column the number preceeded by the # symbol and place it in a new column named user_id.

name                                                  greeting                                                  user_id
Austin Gaylord                                  Hola que tal #4702665                    4702665
Kacie Zulauf                                      Bienvenido 45454545 tal                470815

                                                              #470815 BD. WA470815

NOTE: To keep it simple assume that the user_id will be having varchar type



Källa: https://www.codewars.com/kata/sql-easy-regex-extraction/train/sql

 

Mitt försök att lösa uppgiften:

SELECT name, greeting, REGEXP_MATCHES(greeting,'#([0-9_]+)','g') AS user_id from greetings

Mitt resultat:
Felmeddelande:
Test Failed expected: "4702665" got: "{4702665}" (compared using ==)

Fråga:

Hur blir jag av med klamrarna runt siffrorna i den tredje kolumnen? 

Affe Jkpg 6630
Postad: 21 maj 2019 09:39

Kan man göra så här?

SELECT name, greeting, REGEXP_MATCHES(greeting,'#([0-9_]{6,7})','g') AS user_id from greetings

eftersom du har 'g' kommer resultatet bli en array. Om du är säker på att det bara är ETT userid per greeting kan du ta bort 'g' och slippa {} men om du har flera userid får du då bara det första ...

Ett annat sätt är att använda 'unnest' men då kanske din output blir lite konstig.

Kanske array_to_string är en lösning?
SELECT name, greeting,array_to_string(REGEXP_MATCHES(greeting,'#([0-9_]+)','g') , ',' ) AS user_id FROM greetings

Jag har ingen miljö att testa i så jag kanske är inne på helt fel spår.

TB16 182 – Fd. Medlem
Postad: 22 maj 2019 21:38
Affe Jkpg skrev:

Kan man göra så här?

SELECT name, greeting, REGEXP_MATCHES(greeting,'#([0-9_]{6,7})','g') AS user_id from greetings

När jag kör din kod får jag följande två felmeddelanden:

Test Failed expected: 100 got: 2 (compared using ==)
 should return expected indexes
Test Failed expected: "4702665" got: "{4702665}" (compared using ==)

Vad gör {6,7} i din kod? 

TB16 182 – Fd. Medlem
Postad: 22 maj 2019 21:55
joculator skrev:

eftersom du har 'g' kommer resultatet bli en array. Om du är säker på att det bara är ETT userid per greeting kan du ta bort 'g' och slippa {} men om du har flera userid får du då bara det första ...

Ett annat sätt är att använda 'unnest' men då kanske din output blir lite konstig.

Kanske array_to_string är en lösning?
SELECT name, greeting,array_to_string(REGEXP_MATCHES(greeting,'#([0-9_]+)','g') , ',' ) AS user_id FROM greetings

Jag har ingen miljö att testa i så jag kanske är inne på helt fel spår.

Din kod passerade alla test :) Vad gör sista kommatecknet i koden?

Svara
Close