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?
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.
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?
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 greetingsJag 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?