wake-up-neo.com

MySQL SELECT CASE WENN DANN dann NULL zurückgegeben wird

Tabelle who 

wid--name-------father---mother  
1----Daisy------David----Liza  
2----Jenny------Joe------Judy  
3----Meggy------Mike-----Manuela  
4----Sarah------Joe------Judy  
5----Chelsea----Bill-----Hillary  
6----Cindy------David----Liza    
7----Kelly------Joe------Judy 

Tabelle ages 

aid---whoid---age  
1-----1--------0  
2-----2--------0  
3-----3-------14  
4-----4-------30  
5-----5-------22  
6-----6-------17  
7-----1-------18  

Ich möchte diese Liste als Ergebnis:

id---name------age  
1----Meggy-----14  
2----Cindy-----17  
3----Daisy-----18 (Selected data that bigger than 0)  
4----Chelsea---22  
5----Sarah-----30  
6----Jenny-----30 (Her age is 0 on ages table and Sarah's age with same father and mother)  
7----Kelly-----30 (No data on ages table and Sarah's age with same father and mother)

Ich habe diese Abfrage versucht: 

SELECT 
    *,  
    (CASE age  
        WHEN '0' THEN (
            SELECT age 
            FROM ages a 
            LEFT JOIN who w 
                ON w.wid = a.whoid 
            WHERE 
                w.father = father 
                AND 
                w.mother = mother 
            ORDER BY a.age DESC LIMIT 1
        )  
        ELSE age  
    END
    ) AS newage  
FROM who  
LEFT JOIN ages 
    ON wid = whoid  
ORDER BY  newage

Was stimmt damit nicht?

15

CASE … WHEN NULL wird niemals mit irgendetwas übereinstimmen, und CASE NULL stimmt immer mit der ELSE-Klausel überein (die in Ihrem Fall age zurückgibt, d. h. NULL).

Benutze das:

CASE COALESCE(age, 0) WHEN 0 THEN … ELSE age END

Update:

Sie müssen auch Ihre Tabellen als Aliasnamen verwenden und die Aliasnamen in den Feldbeschreibungen verwenden:

SELECT  *,
        CASE COALESCE(age, 0)
        WHEN '0' THEN
                (
                SELECT  MAX(age)
                FROM    who wi
                JOIN    ages ai
                ON      ai.whoid = wi.wid
                WHERE   wi.father = w.father
                        AND wi.mother = w.mother
                )
        ELSE
                age
        END AS newage
FROM    who w
LEFT JOIN
        ages a
ON      a.whoid = w.wid
ORDER BY
        newage
21
Quassnoi

Der Vater und die Mutter in Ihrer Unterauswahl werden wahrscheinlich in Ihrer äußeren Frage mit dem Vater und der Mutter verwechselt. Oder haben Sie gefragt, warum es nicht optimal ist?

0
Parris Varney