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

joculator 5289 – F.d. Moderator
Postad: 21 maj 2019 10:04

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