2016-08-21 2 views
0

ich folgendes Schema haben:sql, Anhängen und bestimmen Wert innerhalb einer Zelle

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"); 

Was ich versuche ist eine Tabelle mit dem anderen anhängen und dann fügen Sie eine weitere Spalte (colG). Abhängig vom Datumsbereich in colA sollte in jeder Zelle in colG eine andere Nachricht angezeigt werden. Ich werde auch eine andere Spalte hinzufügen, die eine Nachricht abhängig vom Wert der Ganzzahl haben wird. Ich suche also nach einem allgemeinen Ansatz. Irgendwelche Ideen, wie man das erreicht? Sehr geschätzt. Dies ist, was ich versucht habe:

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

, wo die Spalte Datum ist .., aus welcher Tabelle Sie Sie diesen Wert erhalten? – scaisEdge

Antwort

0

Wenn Ihre Syntax korrekt war, sollte Ihr SQL tun, was Sie wollen. Etwas wie folgt aus:

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; 

Hinweise:

  • Datum Konstanten müssen in einfache Anführungszeichen eingewickelt werden (in den meisten Datenbanken).
  • String-Konstanten sollten in einfache Anführungszeichen eingeschlossen werden (der ANSI-Standard).
  • case Anweisungen bewerten jede Klausel in Reihenfolge, so dass Sie die Logik vereinfachen können.
0

Sind Sie sich sicher über die Datentypen auf Ihrem Tisch?

  • colA ist ein DATE und COLD ist ein TEXT
  • colB ist ein INT UND COLE ist ein TEXT

In den meisten Datenbank-Engines Ihre Gewerkschaft Anweisung scheitern würde, wenn die oben genannten Datentypen korrekt sind. Die meisten relationalen Datenbank-Engines erfordern, dass die Datentypen den Elementen einer Union-Anweisung entsprechen.

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

Sie sollten auch die Spalte Datum erhalten und die Zeichenfolge Datum konvertieren Datum

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; 
Verwandte Themen