2016-02-23 94 views
-3

假設我有表XYZ,其中包含一個存儲值SUNDAY,SATURDAY的列Weekend_Days,並且我有另一個表ABC,其中包含日期ACT_DATE,該日期可以是任意日期。現在我必須檢查這一天的這一天是不是週末。在存儲逗號分隔值的列值中搜索值

我試着使用:

select ACT_DATE 
,  case 
      when UPPER(TO_CHAR(ACT_DATE,'DAY')) IN (SELECT Weekend_Days from XYZ) 
       then 1 
      else 0 
     end as Weekend_Flag 
from ABC 

但它不能正常工作,它只是所有日期返回0。

嘗試將Weekend_Days的值存儲爲('SUNDAY','SATURDAY'),但沒有奏效。

示例數據:

表XYZ:

WEEKEND_DAYS 
--------------- 
SUNDAY,SATURDAY 

表ABC:

ACT_DATE 
--------- 
02-Feb-16 
06-Feb-16 

當前結果:

ACT_DATE WEEKEND_FLAG 
--------- ------------ 
02-Feb-16   0 
06-Feb-16   0 

預期結果:

ACT_DATE WEEKEND_FLAG 
--------- ------------ 
02-Feb-16   0 
06-Feb-16   1 
+0

請正確標記您的DBMS,我不認爲您同時使用'mysql'和'oracle'。另外,你可以發佈一些樣本數據嗎? – HoneyBadger

+0

發佈創建和插入語句。並顯示您所需的輸出。 –

回答

0

甲骨文設置

CREATE OR REPLACE FUNCTION split_String(
    i_str IN VARCHAR2, 
    i_delim IN VARCHAR2 DEFAULT ',' 
) RETURN SYS.ODCIVARCHAR2LIST DETERMINISTIC 
AS 
    p_result  SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(); 
    p_start  NUMBER(5) := 1; 
    p_end   NUMBER(5); 
    c_len CONSTANT NUMBER(5) := LENGTH(i_str); 
    c_ld CONSTANT NUMBER(5) := LENGTH(i_delim); 
BEGIN 
    IF c_len > 0 THEN 
    p_end := INSTR(i_str, i_delim, p_start); 
    WHILE p_end > 0 LOOP 
     p_result.EXTEND; 
     p_result(p_result.COUNT) := SUBSTR(i_str, p_start, p_end - p_start); 
     p_start := p_end + c_ld; 
     p_end := INSTR(i_str, i_delim, p_start); 
    END LOOP; 
    IF p_start <= c_len + 1 THEN 
     p_result.EXTEND; 
     p_result(p_result.COUNT) := SUBSTR(i_str, p_start, c_len - p_start + 1); 
    END IF; 
    END IF; 
    RETURN p_result; 
END; 
/

CREATE TABLE xyz (weekend_days) AS 
SELECT 'SATURDAY,SUNDAY' FROM DUAL; 

CREATE TABLE abc (act_date) AS 
SELECT DATE '2016-02-02' FROM DUAL UNION ALL 
SELECT DATE '2016-02-06' FROM DUAL; 

查詢

SELECT act_date, 
     CASE WHEN w.Weekend_day IS NULL THEN 0 ELSE 1 END AS weekend_flag 
FROM abc a 
     LEFT OUTER JOIN 
     (SELECT t.column_value AS weekend_day 
     FROM xyz x, 
       TABLE(split_String(x.weekend_days)) t 
    ) w 
     ON TRIM(TO_CHAR(a.ACT_DATE, 'DAY')) = w.Weekend_day; 

輸出

ACT_DATE WEEKEND_FLAG 
--------- ------------ 
06-FEB-16   1 
02-FEB-16   0 

備用查詢

SELECT act_date, 
     CASE 
     WHEN INSTR(x.weekend_days, TRIM(TO_CHAR(act_date, 'DAY'))) > 0 
     THEN 1 
     ELSE 0 
     END AS weekend_flag 
FROM abc a 
     CROSS JOIN 
     xyz x; 

這將給予相同的輸出,並且將天的名字,但是無法對一般情況下工作,因爲你可能會得到與子字符串錯誤匹配。

-1

UPDATE

,因爲我不明白有機磷農藥的第一種方式提問,這裏是新的聲明,現在應該努力!

SELECT 
ACT_DATE, 
CASE 
WHEN UPPER(DATENAME(DW, ACT_DATE)) IN (SELECT LEFT(Weekend_Days, CHARINDEX(',', Weekend_days + ',') - 1) AS Sat FROM @XYZ 
             UNION ALL 
             SELECT STUFF(Weekend_Days, 1, CHARINDEX(',', Weekend_Days + ','), '') AS Sun FROM @XYZ) 
    THEN 1 
    ELSE 0 
END AS Weekend_flag 
FROM @ABC 

OLD:

SELECT 
ACT_DATE, 
CASE 
WHEN UPPER(DATENAME(DW, ACT_DATE)) IN (SELECT Weekend_Days FROM XYZ) 
    THEN 1 
    ELSE 0 
END AS Weekend_flag 
FROM ABC 

你可以得到一週與方法 「DATENAME」 與間隔天 「周 - DW」 給出。參考:http://www.techonthenet.com/sql_server/functions/datename.php

希望這有助於!

編輯:

OP表示IN功能無法正常工作。那麼我用虛擬數據來嘗試它,對我來說它正在工作。這裏是我的假聲明:

DECLARE @XYZ Table(Weekend_Days varchar(255)) 
DECLARE @ABC Table(ACT_DATE datetime) 

INSERT INTO @XYZ VALUES('SAMSTAG') 
INSERT INTO @XYZ VALUES('SONNTAG') 

INSERT INTO @ABC VALUES('02-Feb-16') 
INSERT INTO @ABC VALUES('03-Feb-16') 
INSERT INTO @ABC VALUES('04-Feb-16') 
INSERT INTO @ABC VALUES('05-Feb-16') 
INSERT INTO @ABC VALUES('06-Feb-16') 
INSERT INTO @ABC VALUES('07-Feb-16') 
INSERT INTO @ABC VALUES('08-Feb-16') 
INSERT INTO @ABC VALUES('09-Feb-16') 
INSERT INTO @ABC VALUES('10-Feb-16') 
INSERT INTO @ABC VALUES('11-Feb-16') 
INSERT INTO @ABC VALUES('12-Feb-16') 
INSERT INTO @ABC VALUES('13-Feb-16') 
INSERT INTO @ABC VALUES('14-Feb-16') 
INSERT INTO @ABC VALUES('15-Feb-16') 
INSERT INTO @ABC VALUES('16-Feb-16') 

SELECT 
ACT_DATE, 
CASE 
    WHEN UPPER(DATENAME(DW, ACT_DATE)) IN (SELECT Weekend_Days FROM @XYZ) 
    THEN 1 
    ELSE 0 
END AS Weekend_flag 
FROM @ABC 

我的結果如下:

ACT_DATE Weekend_flag 
2016-02-23 11:37:48.810 0 
2016-02-02 00:00:00.000 0 
2016-02-03 00:00:00.000 0 
2016-02-04 00:00:00.000 0 
2016-02-05 00:00:00.000 0 
2016-02-06 00:00:00.000 1 
2016-02-07 00:00:00.000 1 
2016-02-08 00:00:00.000 0 
2016-02-09 00:00:00.000 0 
2016-02-10 00:00:00.000 0 
2016-02-11 00:00:00.000 0 
2016-02-12 00:00:00.000 0 
2016-02-13 00:00:00.000 1 
2016-02-14 00:00:00.000 1 
2016-02-15 00:00:00.000 0 
2016-02-16 00:00:00.000 0 
+0

我從上述方法獲得星期幾,它的IN功能不起作用 –

+0

它正在工作。剛試過。 –

+0

我想你已經誤解了這個問題,兩個週末的價值都儲存在一個單元格中,所以試着使用:INSERT INTO @XYZ VALUES('SUNDAY,SATURDAY')並嘗試獲得預期結果 –