J'ai une colonne code> varchar code> contenant 5 informations (2 Je voudrais extraire le 4ème champ ... p> ... pour avoir quelque chose comme p> char (3) code> et 3
horodatage code>) séparé avec '
$ code> '.
SELECT SPLIT(COL, '$', 4) FROM MYTABLE
1
-----
'null'
'null'
'2009-04-10 10:50:00'
5 Réponses :
Je suis sûr qu'il y a une meilleure façon d'écrire cela, mais voici une solution de 1 (SQL) pour le cas simple donné. Il pourrait être réécrit comme une procédure stockée pour rechercher une chaîne arbitraire. Il peut également y avoir des outils / extensions tiers pour aider avec la scission que vous souhaitez ...
select locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1) as poss3rdDollarSign, -- position of 3rd dollar sign locate('$', col, (locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1)) + 1) as poss4thDollarSign, -- position of 4th dollar sign (locate('$', col, (locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1)) + 1)) - (locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1)) - 1 as stringLength,-- length of string between 3rd and 4th dollar sign substr(col, locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1) + 1, (locate('$', col, (locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1)) + 1)) - (locate('$', col, (locate('$',col, (locate('$',col) +1))) + 1)) - 1) as string from mytable
+1 pour l'effort :-). J'ai aussi fini par faire quelque chose de similaire, mais je cherche quelque chose de plus générique i>.
C'est affreux, mais c'était exactement ce dont j'avais besoin pour m'aider à analyser de la chaîne dans une requête. Merci!
Merci pour la fonction de localisation. A contribué à une autre chaîne d'analyse de la chaîne, je devais convertir un Varchar avec: USD à la fin de celui-ci à un décalage.
SELECT split(3,'$',col) from mytable; -- or SELECT split(0,'-', 'first-second-third') from sysibm.sysdummy1; SELECT split(0,'-', 'returns this') from sysibm.sysdummy1; SELECT split(1,'-', 'returns null') from sysibm.sysdummy1;
L'accepter, car c'est exactement ce que j'ai cherché (3ème option). Pouvez-vous simplement ajouter le code> déterministe code> et le modificateur d'action externe code>, pour pouvoir l'utiliser dans un groupe Groupe par code> Clause?
Bon point. Changé pour renvoyer NULL lorsque l'élément n'est pas trouvé. Demander le premier élément, avec non-existant-Deliemeter, retournera la chaîne d'origine.
Essayez ceci, cela fonctionne!
CREATE FUNCTION SPLIT( P_1 VARCHAR(3200), P_2 VARCHAR(200)) RETURNS TABLE(P_LIST VARCHAR(3200)) SPECIFIC SPLIT LANGUAGE SQL MODIFIES SQL DATA NO EXTERNAL ACTION F1: BEGIN return with source(str, del) as (select p_1, p_2 from sysibm.sysdummy1), target(str, del) as (select source.str, source.del from source where length(source.str) > 0 union all select (case when (instr(target.str, target.del) > 0) then substr(target.str, instr(target.str, target.del)+1, length(target.str)-instr(target.str, target.del)) else null end), (case when (instr(target.str, target.del) > 0) then target.del else null end) from target where length(target.str) > 0 ) select str from target where str is not null; END
Quelle est la différence entre votre réponse et les précédents?
Si la version de votre DB2 peut le faire, vous pouvez utiliser la fonction Locate_IN_String pour trouver la position de votre séparateur. La fonction locate_in_string renvoie la position de départ d'une chaîne et vous permet de choisir la nième instance. Vous pouvez trouver une documentation de cette fonction ici
pour Votre exemple, vous pouvez utiliser ce code: p>
substr(e.data,1,13) as NNSS, substring(e.data, LOCATE_IN_STRING(e.data, ';', 1, 1, CODEUNITS32)+1, (LOCATE_IN_STRING(e.data, ';', 1, 2, CODEUNITS32) - LOCATE_IN_STRING(e.data, ';', 1, 1, CODEUNITS32)-1) ) as Name, substring(e.data, LOCATE_IN_STRING(e.data, ';', 1, 2, CODEUNITS32)+1, (LOCATE_IN_STRING(e.data, ';', 1, 3, CODEUNITS32) - LOCATE_IN_STRING(e.data, ';', 1, 2, CODEUNITS32)-1) ) as Vorname, substring(e.data, LOCATE_IN_STRING(e.data, ';', 1, 3, CODEUNITS32)+1, (LOCATE_IN_STRING(e.data, ';', 1, 4, CODEUNITS32) - LOCATE_IN_STRING(e.data, ';', 1, 3, CODEUNITS32)-1) ) as Grund