2016-08-21 74 views
0

我有以下模式中確定的值:SQL,追加和細胞

CREATE TABLE table1(colA DATE, colB INT, colC TEXT); 

INSERT INTO table1(colA, colB, colC) VALUES ("2016-01-01", "1", "C1"); 
INSERT INTO table1(colA, colB, colC) VALUES ("2016-01-02", "2", "C2"); 

CREATE TABLE table2(colD TEXT, colE TEXT, colF TEXT); 

INSERT INTO table2(colD, colE, colF) VALUES ("2016-01-03", "3", "F1"); 
INSERT INTO table2(colD, colE, colF) VALUES ("2016-01-04", "4", "F2"); 

我所試圖做的是一個表追加到另一個,然後添加另一列(COLG)。 colA中的每個單元格中應顯示不同的消息,具體取決於colA中的日期範圍。我還將添加另一列,該列將根據整數的值而有一條消息。所以我正在尋找一個通用的方法。任何想法如何實現?非常感激。這是我所嘗試的:

SELECT colA, 
     colB, 
     CASE When date <2016-01-01 "daterange A" 
      When date <2016-01-01<2016-01-02 "daterangeB" 
      When date <2016-01-02<2016-01-03 "daterangeC" 
      When date <2016-01-03<2016-01-04 "daterangeD" 

     AS colG 
FROM (
    SELECT colA, colB FROM table1 
    UNION ALL 
    SELECT colD, colE FROM table2 
) union_tbl; 
+0

其中是哪個表你,你獲得這個值的列日..? – scaisEdge

回答

0

如果你的語法正確,你的SQL應該做你想做的。事情是這樣的:

SELECT colA, 
     colB, 
     (CASE When date < '2016-01-01' then 'daterange A' 
      When date < '2016-01-02' then 'daterangeB' 
      When date < '2016-01-03' then 'daterangeC' 
      When date < '2016-01-04' then 'daterangeD' 
     END) AS colG 
FROM (SELECT colA, colB FROM table1 
     UNION ALL 
     SELECT colD, colE FROM table2 
    ) t; 

注:

  • 日期常量需要被包裹在單引號(在大多數數據庫)。
  • 字符串常量應該用單引號(ANSI標準)包裝。
  • case語句按順序評估每個子句,因此可以簡化邏輯。
0

您確定您桌子上的數據類型?

  • 可樂日期和感冒是TEXT
  • COLB是INT和科爾是一個文本

在大多數的數據庫引擎,如果上述數據類型是正確的你的工會語句將失敗。大多數關係數據庫引擎都要求數據類型匹配union語句的成員。

SELECT colA, 
     colB, 
     (CASE When date < '2016-01-01' then 'daterange A' 
      When date < '2016-01-02' then 'daterangeB' 
      When date < '2016-01-03' then 'daterangeC' 
      When date < '2016-01-04' then 'daterangeD' 
     END) AS colG 
FROM (SELECT 
      CAST(colA AS TEXT) AS colA 
      , CAST(colB AS TEXT) AS colB 
     FROM table1 
     UNION ALL 
     SELECT colD, colE FROM table2 
    ) tba; 
0

你也應該獲得列日和轉換您的字符串日期日期

SELECT colA, 
     colB, 
     (CASE When `date` < str_to_date('2016-01-01', '%Y-%m%d') then 'daterange A' 
       When `date` < str_to_date('2016-01-02', '%Y-%m%d') then 'daterangeB' 
       When `date` < str_to_date('2016-01-03', '%Y-%m%d') then 'daterangeC' 
       When `date` < str_to_date('2016-01-04', '%Y-%m%d') then 'daterangeD' 
      END) AS colG 
    FROM (SELECT colA, colB, `date` FROM table1 
     UNION ALL 
     SELECT colD, colE, `date` FROM table2 
     ) my_t;