Konfiguracja Oracle :
<> TWÓRZ LUB ZAMIEŃ FUNKCJĘ split_String( i_str IN VARCHAR2, i_delim IN VARCHAR2 DEFAULT ',') RETURN SYS.ODCIVARCHAR2LIST DETERMINISTICAS p_result SYS.ODCIVARCHAR2LIST :=SYS.ODCIVARCHAR2LIST(); p_start LICZBA(5) :=1; p_end NUMER(5); c_len STAŁA LICZBA(5) :=DŁUGOŚĆ( i_str ); c_ld STAŁA LICZBA(5) :=DŁUGOŚĆ( i_delim );BEGIN JEŻELI c_len> 0 TO p_end :=INSTR( i_str, i_delim, p_start ); PODCZAS p_end> 0 PĘTLA p_result.EXTEND; p_result( p_result.COUNT ) :=SUBSTR( i_str, p_start, p_end - p_start ); p_start :=p_koniec + c_ld; p_end :=INSTR( i_str, i_delim, p_start ); PĘTLA KOŃCOWA; JEŻELI p_start <=c_len + 1 TO p_result.EXTEND; p_result( p_result.COUNT ) :=SUBSTR( i_str, p_start, c_len - p_start + 1 ); KONIEC JEŚLI; KONIEC JEŚLI; RETURN p_result;END;/CREATE TABLE xyz ( weekend_dni ) ASSELECT 'SOBOTA, NIEDZIELA' FROM DUAL;CREATE TABLE abc ( act_date ) ASSELECT DATE '2016-02-02' FROM DUAL UNION ALLSELECT DATE '2016-02-06' FROM DUAL;
Zapytanie
SELECT data_czynna, CASE WHEN w.dzień_weekendu JEST NULL THEN 0 ELSE 1 END AS flaga_weekenduFROM abc a LEFT OUTER JOIN ( SELECT t.column_value AS dzień_weekendu FROM xyz x, TABLE( split_String( x.dni_weekendu )) ) t . w ON TRIM( TO_CHAR( a.ACT_DATE, 'DAY') ) =w.Weekend_day;
Wyjście :
ACT_DATE WEEKEND_FLAG--------- ------------06-LUTY-16 1 02-LUTY-16 0
Zapytanie alternatywne :
SELECT data_czynna, CASE WHEN INSTR( x.weekend_days, TRIM( TO_CHAR( data_czynna, 'DZIEŃ' ) ) )> 0 THEN 1 ELSE 0 END AS weekend_flagFROM abc a CROSS JOIN xyz x;
Da to ten sam wynik i będzie działać dla nazw dni, ale nie zadziała w przypadku ogólnym, ponieważ możesz uzyskać fałszywe pozytywne dopasowanie do podłańcucha.