sql >> Database teknologi >  >> RDS >> Oracle

Opdel kommaseparerede værdier til kolonner i Oracle

Pas på! Regexp_substr-udtrykket for formatet '[^,]+' returnerer ikke den forventede værdi, hvis der er et null-element i listen, og du vil have det element eller et efter det. Overvej dette eksempel, hvor det 4. element er NULL, og jeg vil have det 5. element og derfor forventer, at '5'et bliver returneret:

SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;

R
-
6

Overraskelse! Det returnerer det 5. IKKE-NULL element, ikke det faktiske 5. element! Forkerte data returneres, og du kan ikke engang fange dem. Prøv dette i stedet:

SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;

R
-
5

Så ovenstående korrigerede REGEXP_SUBSTR siger, at man skal lede efter den 5. forekomst af 0 eller flere kommaseparerede tegn efterfulgt af et komma eller slutningen af ​​linjen (tillader den næste separator, det være sig et komma eller slutningen af ​​linjen) og når den findes, returnerer den første undergruppe (dataene inkluderer IKKE kommaet eller slutningen af ​​linjen).

Søgematchmønsteret '(.*?)(,|$)' forklaret:

(             = Start a group
.             = match any character
*             = 0 or more matches of the preceding character
?             = Match 0 or 1 occurrences of the preceding pattern
)             = End the 1st group
(             = Start a new group (also used for logical OR)
,             = comma
|             = OR
$             = End of the line
)             = End the 2nd group

EDIT:Mere info tilføjet og forenklet regex.

Se dette indlæg for mere info og et forslag til at indkapsle dette i en funktion til nem genbrug:REGEX for at vælge n'te værdi fra en liste, hvilket giver mulighed for nullsDet er indlægget, hvor jeg opdagede formatet '[^,]+' har problemet. Desværre er det regex-formatet, du oftest vil se som svaret på spørgsmål om, hvordan man analyserer en liste. Jeg gyser ved at tænke på alle de forkerte data, der returneres af '[^,]+' !



  1. Kan du VÆLGE alt, undtagen 1 eller 2 felter, uden forfatterkrampe?

  2. Hvordan bruger man Room Persistence Library med forududfyldt database?

  3. Konverter JS datotid til MySQL datotid

  4. Sådan kombinerer du dato fra et felt med tid fra et andet felt - MS SQL Server