J'ai la requête ci-dessous dans laquelle pour certains Maintenant, je veux définir la valeur dans le champ Si le nom de départ n'est pas de mois à partir de janvier, puis que vous puissiez voir pour Actuellement dans ma requête Sélectionner J'utilise ci-dessous condition pour obtenir le numéro de mois à partir de Security_Typ CODE> Field, je reçois la valeur correcte à partir du nom de mois pour champ Nom code> mais quelques Security_Type code> Champ La valeur ne commence pas à partir du nom de mois ou il n'y a pas de nom de mois prévu dans celui de champ Nom code>. Monat code> Le numéro Type de données de telle sorte que si la valeur commence à partir de champ Nom code> est le nom de mois de janvier à décembre, puis définissez-le sur leur numéro de mois par exemple si le nom du démarrage est d'août, définissez-le ensuite sur 8. P > Securtiy_typ code> 'Option d'index financier' puis prenez le mois de champ opt_expirs_dt et définissez-le dans monat Champ. P> Nom CODE> champ et le réglage pour champ Monat Code> et je veux modifier cette requête SELECT: P> Select to_number(TO_CHAR(to_date(UPPER(SUBSTR(name, 0, instr(name,' ', 1, 1) - 1)),'MONTH',
'NLS_DATE_LANGUAGE = American'),'MM')) monat from BB_EQUOPT_IMPORT
3 Réponses :
SELECT CASE WHEN UPPER(SUBSTR(name, 0, instr(name,' ', 1, 1) - 1)) NOT IN ('JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER','OCTOBER','NOVEMBER','DECEMBER')
THEN TO_NUMBER(TO_CHAR(opt_expiry_date, 'MM'))
ELSE
DECODE(UPPER(SUBSTR(name, 0, instr(name,' ', 1, 1) - 1)), 'JANUARY', 1, 'FEBRUARY', 2, 'MARCH', 3, 'APRIL', 4, 'MAY', 5, 'JUNE', 6, 'JULY', 7, 'AUGUST', 8, 'SEPTEMBER', 9,
'OCTOBER', 10, 'NOVEMBER', 11, 'DECEMBER', 12, -1) END as MONAT
FROM bb_equoptimport
Je reçois -1 en conséquence, ce qui n'est pas un numéro de mois valide et non dans le champ Nom, la valeur vient par exemple "janvier x45to" et c'est pourquoi je vérifie la première chaîne de ce champ si ce n'est son nom de mois ou non
Utilisation: supérieure (substruisement (nom, 0, instrtr (nom (nom, '', 1, 1) - 1)) Pour le champ Nom comme dans votre exemple.
Merci son travail mais juste un petit changement peut vous s'il vous plaît utiliser nls_date_language = américain comme je l'ai mentionné dans ma requête SELECT, car il est très important car je reçois des données d'America et Opt_Expiry_date champ est de la date de la date, alors pourquoi to_char?
Cette solution est déjà valable pour l'Amérique, je fais de la première fois à extraire le mois à compter de la date, vous ne pouvez pas faire: to_number (sysdate, 'mm') directement, vous pouvez également utiliser l'extrait comme les autres utilisateurs.
Une seule question sera-t-elle un problème de performance que j'utilise cette logique en vue? J'ai comme 1935486 rangées dans cette vue
Vous pouvez utiliser une expression de cas pour décider quelle colonne obtenir la valeur du mois de: ou: p> with BB_EQUOPT_IMPORT (name, security_typ, opt_expiry_dt) as (
select 'JANUARY FOO', 'Equity Option', date '2020-01-20' from dual
union all
select 'MAY BAR', 'Equity Option', date '2020-05-18' from dual
union all
select 'MICEX', 'Financial index option.', date '2019-11-21' from dual
union all
select 'SX5E', 'Financial index option.', date '2020-12-18' from dual
)
select name, security_typ, opt_expiry_dt,
extract(month from
coalesce(
to_date(substr(name, 1, instr(name, ' ') - 1) default null on conversion error,
'MONTH', 'NLS_DATE_LANGUAGE=ENGLISH'),
opt_expiry_dt
)
) as monat
from BB_EQUOPT_IMPORT;
NAME SECURITY_TYP OPT_EXPIRY MONAT
----------- ----------------------- ---------- ----------
JANUARY FOO Equity Option 2020-01-20 1
MAY BAR Equity Option 2020-05-18 5
MICEX Financial index option. 2019-11-21 11
SX5E Financial index option. 2020-12-18 12
Ceci est codé dur et j'ai des milliers d'options de nom différentes qui ne commencent pas à partir du nom de mois lui-même
Je n'utilise que le nom du tout pour "Option de capitaux propres". Ou voulez-vous dire qu'il y a beaucoup de valeurs code> Security_TyP CODE> qui pourraient avoir des noms de mois, pas seulement celui-là? Encore trop nombreux pour énumérer dans l'expression de cas? J'ai ajouté un moyen convivial de 18 jours de ne pas avoir besoin de connaître les noms et de compter sur la conversion de défaillance ...
@Andrew - La requête d'erreur de conversion J'ai ajouté est probablement le moyen le plus simple de le faire pour 18 ° C (ou 12CR2, cela ne fonctionne pas avant cela) - Si I> Vous devez réellement regarder ce mois-ci à tout. Il ne semble pas que vous ayez besoin de faire, s'il correspond toujours à la date d'expiration du mois de toute façon.
Comme vous dites que la colonne Nom ne peut pas contenir un mois valide différent du mois d'opt_expiy_date, vous pouvez ignorer la colonne Nom et simplement extraire le mois à partir de opt_expiry_date:
select name, security_typ, opt_expiry_date, extract(month from opt_expiry_date) as monat from bb_equopt_import;
Avoir le résultat souhaité aiderait beaucoup.
J'ai ajouté le résultat souhaité
Quelle version d'Oracle utilisez-vous?
J'utilise oracle 18c
le nom du mois est en fait je n'utilise pas dans ma table ... c'est juste pour montrer le résultat que je mets là
La colonne NAME peut-elle contenir un mois valide différent du mois de Opt_Expiry_Date? Dans votre exemple de données, ce n'est jamais le cas, vous pouvez donc TOUJOURS B> Extraire le mois de Opt_Expiry_Date.
Oui, il suffit d'extraire le mois de opt_expiry_date