TB16 är nöjd med hjälpen!
TB16 185
Postad: 20 maj 2019 Redigerad: 20 maj 2019

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 4854
Postad: 21 maj 2019

Kan man göra så här?

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

joculator 1664 – Moderator
Postad: 21 maj 2019

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 185
Postad: 22 maj 2019
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 185
Postad: 22 maj 2019
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 Avbryt
Close