Il manque encore la table RESORT_ORIGINS_OF_BOOKING, Celle que tu donnes c'est le script de la RESERVATION_SUMMARY
Il manque encore la table RESORT_ORIGINS_OF_BOOKING, Celle que tu donnes c'est le script de la RESERVATION_SUMMARY
Désolé voici la table :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 CREATE TABLE OPERA.RESORT_ORIGINS_OF_BOOKING ( RESORT VARCHAR2(20 BYTE) NOT NULL, SOURCE_CODE VARCHAR2(20 BYTE) NOT NULL, PARENT_SOURCE_CODE VARCHAR2(20 BYTE), DESCRIPTION VARCHAR2(2000 BYTE), INSERT_USER NUMBER NOT NULL, INSERT_DATE DATE NOT NULL, UPDATE_USER NUMBER NOT NULL, UPDATE_DATE DATE NOT NULL, INACTIVE_DATE DATE, SELL_SEQUENCE NUMBER, SC_ORDERBY NUMBER ) TABLESPACE OPERA_DATA PCTUSED 0 PCTFREE 10 INITRANS 1 MAXTRANS 255 STORAGE ( INITIAL 512K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.INSERT_DATE IS 'The date the record was created'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.UPDATE_USER IS 'The user that modified the record'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.UPDATE_DATE IS 'The date the record was modified'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.INACTIVE_DATE IS 'The date the record was marked as inactive'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.SELL_SEQUENCE IS 'Display sequence'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.SC_ORDERBY IS 'S&C Display Sequence'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.RESORT IS 'The property that the record belongs to'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.SOURCE_CODE IS 'Source code'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.PARENT_SOURCE_CODE IS 'Source group associated to the source code'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.DESCRIPTION IS 'Source description'; COMMENT ON COLUMN OPERA.RESORT_ORIGINS_OF_BOOKING.INSERT_USER IS 'The user that created the record'; CREATE UNIQUE INDEX OPERA.SOURCES_PK ON OPERA.RESORT_ORIGINS_OF_BOOKING (RESORT, SOURCE_CODE) LOGGING TABLESPACE OPERA_INDX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 256K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) NOPARALLEL; CREATE UNIQUE INDEX OPERA.SOURCE_RESORT_IDX ON OPERA.RESORT_ORIGINS_OF_BOOKING (SOURCE_CODE, RESORT) LOGGING TABLESPACE OPERA_INDX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 1M MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 BUFFER_POOL DEFAULT ) NOPARALLEL; CREATE OR REPLACE TRIGGER OPERA.actlog_res_org_booking_aiud AFTER INSERT OR DELETE OR UPDATE ON resort_origins_of_booking REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW Begin Declare vEvent_type varchar2(1); vOld_Rec RESORT_ORIGINS_OF_BOOKING%ROWTYPE; vNew_Rec RESORT_ORIGINS_OF_BOOKING%ROWTYPE; Begin if inserting then vEvent_type := 'I'; elsif updating then vEvent_type := 'U'; elsif deleting then vEvent_type := 'D'; end if; --+ Copy old values into Old_rec variables vOld_rec.RESORT := :old.RESORT; vOld_rec.SOURCE_CODE := :old.SOURCE_CODE; vOld_rec.DESCRIPTION := :old.DESCRIPTION; vOld_rec.PARENT_SOURCE_CODE := :old.PARENT_SOURCE_CODE; vOld_rec.INACTIVE_DATE := :old.INACTIVE_DATE; --+ Copy New values into New_rec variables vNew_rec.RESORT := :new.RESORT; vNew_rec.SOURCE_CODE := :new.SOURCE_CODE; vNew_rec.DESCRIPTION := :new.DESCRIPTION; vNew_rec.PARENT_SOURCE_CODE := :new.PARENT_SOURCE_CODE; vNew_rec.INACTIVE_DATE := :new.INACTIVE_DATE; ACTION_LOG.CAPTURE_SOURCE_CODES(vEvent_type, vOld_Rec, vNew_Rec); End; End; / CREATE OR REPLACE TRIGGER OPERA.resort_origins_of_booking_bi before insert on Resort_origins_of_booking for each row begin if not pms_p.addon_license('OPP_MHOT') then DECLARE temp_var char:=null; BEGIN Select 'x' into temp_var from origins_of_booking_template where source_code=:new.source_code; EXCEPTION WHEN TOO_MANY_ROWS THEN NULL; WHEN NO_DATA_FOUND THEN insert into origins_of_booking_template (source_code,parent_source_code,description,insert_user, insert_date,update_user,update_date,inactive_date,sell_sequence, sc_orderby) values (:new.source_code, :new.parent_source_code, :new.description, :new.insert_user, :new.insert_date, :new.update_user, :new.update_date, :new.inactive_date, :new.sell_sequence, :new.sc_orderby); END; end if; end; / DROP SYNONYM OXI.RESORT_ORIGINS_OF_BOOKING; CREATE SYNONYM OXI.RESORT_ORIGINS_OF_BOOKING FOR OPERA.RESORT_ORIGINS_OF_BOOKING; DROP SYNONYM OXIHUB.RESORT_ORIGINS_OF_BOOKING; CREATE SYNONYM OXIHUB.RESORT_ORIGINS_OF_BOOKING FOR OPERA.RESORT_ORIGINS_OF_BOOKING; ALTER TABLE OPERA.RESORT_ORIGINS_OF_BOOKING ADD ( CONSTRAINT SOURCES_PK PRIMARY KEY (RESORT, SOURCE_CODE) USING INDEX TABLESPACE OPERA_INDX PCTFREE 10 INITRANS 2 MAXTRANS 255 STORAGE ( INITIAL 256K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0 ));
Il y a un problème avec le champs resv_status qui est présent dans 2 tables. Il faudrait savoir dans quelle table tu prends le champs
Présent dans la table RESERVATION_SUMMARY et RESERVATION_NAME.
Je pense que quand tu mets en commentaire les 2 LEFT OUTER JOIN, ta base prend le champs resv_status de RESERVATION_NAME, quand tu enlèves les 2 commentaires il prend celui de RESERVATION_SUMMARY . Or la table RESERVATION_SUMMARY est en LEFT OUTER JOIN mais tu as une restriction dans ton WHERE donc Oracle fait un INNER JOIN implicite
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 SELECT DISTINCT (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM, DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE') AS client_pays, -- ALIAS ICI VER QUELLE TABLE? CASE WHEN RN.resort = 'OPERA' THEN 'Best Western Premier Opera Diamond' WHEN RN.resort = 'BATIGN' THEN 'Opera Batignolles Hotel' WHEN RN.resort = 'PPN' THEN 'Comfort et Quality Hotel Centre del Mon' end CLIENT_HOTEL, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') AS HOTEL_DATE_SORTIE, LOWER (PH.phone_number) AS client_email, RO.DESCRIPTION AS ORIGINE_RESERVATION, TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours from RESERVATION_NAME RN INNER JOIN name NA ON NA.NAME_ID =RN.NAME_ID INNER JOIN NAME_PHONE PH ON PH.NAME_ID=RN.NAME_ID LEFT OUTER JOIN RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID LEFT OUTER JOIN RESORT_ORIGINS_OF_BOOKING RO ON RO.RESORT=RS.RESORT AND RO.SOURCE_CODE =RS.SOURCE_CODE where 1=1 AND RN.resv_status = 'CHECKED OUT' AND TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 AND REGEXP_LIKE (LOWER(PH.phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') and RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy') ORDER BY NB_JOURS DESC Soit tu mets dans la clause where AND RN.resv_status = 'CHECKED OUT' Soit tu mets après dans ton LEFT OUTER join LEFT OUTER JOIN RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID AND RS.resv_status = 'CHECKED OUT'
Trop fort !
Donc je dois préfixer avec RESERVATION_NAME devant resv_status alors ?
SI tu veux prendre le champs resv_status dans table RESERVATION_NAME alors il faut juste reprendre ma requete du dessus avec le
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 AND RN.resv_status = 'CHECKED OUT'
Oui j'ai vu ça fonctionne nickel, vraiment très fort, il y a de l'expertise
Ce qui nous donne au final la requête suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 SELECT DISTINCT (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM, DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE') AS client_pays, -- ALIAS ICI VER QUELLE TABLE? CASE WHEN RN.RESORT = 'OPERA' THEN 'Best Western Premier Opera Diamond' WHEN RN.RESORT = 'BATIGN' THEN 'Opera Batignolles Hotel' WHEN RN.RESORT = 'PPN' THEN 'Comfort et Quality Hotel Centre del Mon' END CLIENT_HOTEL, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') AS HOTEL_DATE_SORTIE, LOWER (PH.phone_number) AS client_email, RO.DESCRIPTION AS ORIGINE_RESERVATION, TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours FROM OPERA.RESERVATION_NAME RN INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID INNER JOIN OPERA.NAME_PHONE PH ON PH.NAME_ID=RN.NAME_ID LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON RO.RESORT=RS.RESORT AND RO.SOURCE_CODE =RS.SOURCE_CODE WHERE 1=1 AND RN.RESV_STATUS = 'CHECKED OUT' AND TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 AND REGEXP_LIKE (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') AND RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy') ORDER BY NB_JOURS DESC
Merci beaucoup pour vos réponses, j'ai besoin d'apporter une modification dans la requête :
dans le cas où RN.RESORT = 'PPN', je dois modifier la REGEXP pour mettre
'^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+' sur le champ phone_number
et sortir à l'affichage un email conforme (sans le *)
ça doit donner un truc comme ça
Pense à mettre en résolu
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 where 1=1 and ( (RN.RESV_STATUS = 'CHECKED OUT' and regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) or (RN.RESV_STATUS = 'PPN' and regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) ) AND TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 AND RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy') ORDER BY NB_JOURS DESC
Bonne journée
Mais tu es sûr, car je vois pas de case when ? et je vois pas comment afficher les réponses sans les "*" ? en fait dans le cas de l'hôtel 'PPN' on a inversé le processus, on doit envoyer aussi aux gens qui ont un '*' dans leur email, par contre il faut que l'email soit débarrassé de '*' à l'affichage pour le logiciel d'emailing.
A d'accord je n'ai fait que la partie WHERE.
Il faut donc que tu remplace dans le select
par
Code : Sélectionner tout - Visualiser dans une fenêtre à part LOWER (PH.phone_number) AS client_email,
Aussi pour ton decode pour faire propre ajoute le cas par defaut
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 CASE WHEN RN.RESV_STATUS = 'CHECKED OUT' THEN 'AFFICHE ICI TON RESULTAT 1' WHEN RN.RESV_STATUS = 'PPN' THEN 'AFFICHE ICI TON RESULTAT 2' else LOWER (PH.phone_number) END AS client_email,
Code : Sélectionner tout - Visualiser dans une fenêtre à part DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE','PAS_FR_NI_EN') AS client_pays,
Désolé, en voulant appliquer (forcément mal) tes conseils, voici ce que j'ai fait :
Voici l'erreur qu'il me met
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 SELECT DISTINCT (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM, DECODE (LANGUAGE, 'F', 'FR','E', 'EN') AS client_pays, CASE WHEN RN.RESORT = 'OPERA' THEN 'Best Western Premier Opera Diamond' WHEN RN.RESORT = 'BATIGN' THEN 'Opera Batignolles Hotel' WHEN RN.RESORT = 'PPN' THEN 'Comfort et Quality Hotel Centre del Mon' END CLIENT_HOTEL, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') AS HOTEL_DATE_SORTIE, LOWER (PH.phone_number) AS client_email, RO.DESCRIPTION AS ORIGINE_RESERVATION, TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours FROM OPERA.RESERVATION_NAME RN INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID INNER JOIN OPERA.NAME_PHONE PH ON PH.NAME_ID=RN.NAME_ID LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON RO.RESORT=RS.RESORT AND RO.SOURCE_CODE =RS.SOURCE_CODE WHERE 1=1 AND RN.RESV_STATUS = 'CHECKED OUT' AND TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 AND (CASE WHEN RN.RESORT = 'PPN' THEN REGEXP_LIKE (LOWER(PH.phone_number), '^[a-zA-Z0-9\-_\*]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ELSE REGEXP_LIKE (LOWER(PH.phone_number), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') END) AND RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy') ORDER BY NB_JOURS DESC
sur "AND RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy')"ORA-00920: invalid relational operator
Le dernier message concernait un block a mettre dans ton Select Ajouter au block du dessus , le block WHERE
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 SELECT DISTINCT (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM, DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE','PAS_FR_NI_EN') AS client_pays, CASE WHEN RN.RESORT = 'OPERA' THEN 'Best Western Premier Opera Diamond' WHEN RN.RESORT = 'BATIGN' THEN 'Opera Batignolles Hotel' WHEN RN.RESORT = 'PPN' THEN 'Comfort et Quality Hotel Centre del Mon' END CLIENT_HOTEL, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') as HOTEL_DATE_SORTIE, case when RN.RESV_STATUS = 'CHECKED OUT' then 'AFFICHE ICI TON RESULTAT 1' when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON RESULTAT 2' else LOWER (PH.PHONE_NUMBER) END AS client_email, RO.DESCRIPTION AS ORIGINE_RESERVATION, TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours FROM OPERA.RESERVATION_NAME RN INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID INNER JOIN OPERA.NAME_PHONE PH ON PH.NAME_ID=RN.NAME_ID LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON RO.RESORT=RS.RESORT AND RO.SOURCE_CODE =RS.SOURCE_CODE WHERE 1=1 AND ( (RN.RESV_STATUS = 'CHECKED OUT' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) OR (RN.RESV_STATUS = 'PPN' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) ) AND TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 AND RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy') ORDER BY NB_JOURS DESC
Non mais je crois que tu n'as pas compris ce dont je parle, je dois faire une REGEXP sur le champ PH.phone_number de façon conditionnel, si le champ RN.RESORT = 'PPN j'applique la REGEXP 1 à mon champ PH.phone_number sinon pour les autres valeurs de RN.RESORT j'applique la REGEXP 2. Enfin, l'extract est destiné à un emaling, donc à la sortie, je dois également enlever les "*" du champ phone_number
J'ai bien compris ne t'inquiète pas il faut juste mettre le bon REGEXP à la place de 'AFFICHE ICI TON RESULTAT 1' et 'AFFICHE ICI TON RESULTAT 2'
Bonjour,
Désolé de répondre si tard, j'étais en déplacement, je viens de rentrer et je regarde de suite la suite de nos discussions. Sur ta réponse, en fait ce qui me gêne, a moins que je comprennes pas, c'est ça :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 case when RN.RESV_STATUS = 'CHECKED OUT' then 'AFFICHE ICI TON RESULTAT 1' when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON RESULTAT 2' else LOWER (PH.PHONE_NUMBER) END AS client_email,
ça ne répond pas, il me semble, à la question que je pose..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 AND ( (RN.RESV_STATUS = 'CHECKED OUT' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) OR (RN.RESV_STATUS = 'PPN' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) )
Pour cette partie
ça selectionne ton adresse mail en fonction du RESV_STATUS car de ce que comprend l'adresse mail n'est pas du même type en fonction du RESV_STATUS
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 AND ( (RN.RESV_STATUS = 'CHECKED OUT' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) OR (RN.RESV_STATUS = 'PPN' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) )
Pour la partie suivante c'est pour l'affichage quand la valeur RESV_STATUS = 'CHECKED OUT' alors tu affiches l'adresse mail comme tu veux ( remplace 'AFFICHE ICI TON RESULTAT 1' par ton expression régulière). Quand tu as RN.RESV_STATUS = 'PPN' tu affiches l'adresse mail mais d'une autre façon et enfin dans le cas où ce n'est pas l'un des 2 tu affiches le mail brut de forme
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 case when RN.RESV_STATUS = 'CHECKED OUT' then 'AFFICHE ICI TON RESULTAT 1' when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON RESULTAT 2' else LOWER (PH.PHONE_NUMBER) END AS client_email,
Bonjour Attila771,
je dois mal m'exprimer, désolé je vais te réexposer mon problème :
le resv_status vaut tout le temps "CHECKED OUT" car il s'agit de collecter tous les clients de 3 hôtels (et qui sont déjà partis (le fameux "CHECKED OUT", qu'on distingue par le code établissement "reservation_name.resort" ('OPERA', 'BATIGN' et enfin 'PPN').
Pour chacun de ces établissments, on récupère les infos de séjour du client (nom, prénom, date d'entrée, date de sortie, email, etc....).
Il existe cependant une restriction fonctionnelle, pour éviter que certains clients ne recoivent l'email (parce qu'ils ne veulent plus par exemple), on rajoute une "*" quelque part dans leur email, pour ceux-là il ne faut pas les prendre, et bien sûr, il ne faut que le champs contienne bien un email (d'où la REGEXP). Sauf un cas particulier pour l'établissement PPN : reservation_name.resort = 'PPN', pour lui on a inversé, on envoit uniquement qu'à ceux qui ont "*" dans le champ email, mais bien sûr, à l'affichage on enlève '*' pour que l'outil d'emailing ne plante pas, je sais pas si c'est plus clair ainsi...
Salut,
Voici la nouvelle version en fonction de ce que tu viens de me dire.
J'ai ajouté des commentaires, il faut que tu vérifies les expressions régulières je ne suis pas super fort dans ce domaine
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 SELECT DISTINCT (NA.TITLE || ' ' || RN.SGUEST_FIRSTNAME || ' '|| RN.SGUEST_NAME) AS CLIENT_NOM, DECODE (LANGUAGE, 'F', 'FRANCE','E', 'ANGLETERRE','PAS_FR_NI_EN') AS client_pays, CASE WHEN RN.RESORT = 'OPERA' THEN 'Best Western Premier Opera Diamond' WHEN RN.RESORT = 'BATIGN' THEN 'Opera Batignolles Hotel' WHEN RN.RESORT = 'PPN' THEN 'Comfort et Quality Hotel Centre del Mon' END CLIENT_HOTEL, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_IN_DATE,'DD/MM/YYYY') AS HOTEL_DATE_ENTREE, TO_CHAR (RN.TRUNC_ACTUAL_CHECK_OUT_DATE,'DD/MM/YYYY') as HOTEL_DATE_SORTIE, case when RN.RESV_STATUS = 'PPN' then 'AFFICHE ICI TON cas AVEC * dans le PPN' else 'AFFICHE ICI TON CAS STANDART OU IL y A PAS DE *' END AS client_email, RO.DESCRIPTION AS ORIGINE_RESERVATION, TRUNC (SYSDATE - TO_DATE (RN.trunc_actual_check_out_date)) AS nb_jours FROM OPERA.RESERVATION_NAME RN INNER JOIN OPERA.NAME NA ON NA.NAME_ID =RN.NAME_ID INNER JOIN OPERA.NAME_PHONE PH ON PH.NAME_ID=RN.NAME_ID LEFT OUTER JOIN OPERA.RESERVATION_SUMMARY RS ON RS.EVENT_ID=RN.RESV_NAME_ID LEFT OUTER JOIN OPERA.RESORT_ORIGINS_OF_BOOKING RO ON RO.RESORT=RS.RESORT AND RO.SOURCE_CODE =RS.SOURCE_CODE where 1=1 and RN.RESV_STATUS = 'CHECKED OUT' -- dans tous les cas ils sont CHECKED OUT and (-- premier cas on prend tous ceux qui n'ont pas de * dans leur email ( regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_]*@[a-zA-Z0-9\-_]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) OR-- Deuxieme cas on prend ceux qui ont une * dans leur mail et qui sont (RN.RESORT = 'PPN' AND regexp_like (LOWER(PH.PHONE_NUMBER), '^[a-zA-Z0-9\-_]+[a-zA-Z0-9\.\-_\*]*@[a-zA-Z0-9\-_\*]+\.[a-zA-Z\.\-_]{1,}[a-zA-Z\-_]+') ) ) AND TRUNC( SYSDATE - TO_DATE(RN.TRUNC_ACTUAL_CHECK_OUT_DATE)) > 0 and RN.TRUNC_ACTUAL_CHECK_OUT_DATE >= TO_DATE('01/09/2010', 'dd/mm/yyyy') ORDER BY NB_JOURS DESC
Merci Attila771 pour ta réponse, c'est presque bon, simplement comment j'affiche mon email sans les "*" (dans le champ "LOWER (phone_number) AS client_email") à ce niveau là:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 CASE WHEN RN.RESV_STATUS = 'PPN' THEN 'AFFICHE ICI TON cas AVEC * dans le PPN' ELSE 'AFFICHE ICI TON CAS STANDART OU IL y A PAS DE *' END AS client_email
Je me suis trompé en fait c'est tout simple pour l'affichage comme tu as déjà filtré dans ton Where il faut juste mettre
Cette fonction va remplacer tes * par rien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part REPLACE(LOWER (phone_number),'*') END AS client_email
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager