Pergunta

MySQL Server versão 5.0.45. Considere o seguinte:

( SELECT CASE 
    WHEN t.group_id = 12 THEN 'yes' 
    ELSE 'no' 
    END
    FROM sample_table t
    WHERE t.user_id = 2
    AND t.group_id = 12 ) as foo

Esta subconsulta de uma instrução maior funciona como eu esperava, produzindo um 'sim' ou 'não' valor de seqüência maior parte do tempo. Não é o ideal, mas é o que você tem para trabalhar no código de outra pessoa!

No entanto, por vezes, a selecção pode legitimamente retornar um conjunto vazio, caso em que foo é definido como NULL. Este na verdade não quebrar o aplicativo, mas é irritante. Existe uma maneira eu posso garantir que foo será sempre quer 'sim' ou 'não', mesmo se não houver registros coincidentes na tabela?

Foi útil?

Solução

Se for uma subconsulta escalar, e depois usar essa (i e você usa em uma cláusula SELECT ou WHERE, não na cláusula FROM..):

IF(
EXISTS
(
SELECT  NULL
FROM    sample_table t
WHERE   t.user_id = 2
        AND t.group_id = 12
), 'yes', 'no'
)

ou mesmo esta:

COALESCE(
(
SELECT  'yes'
FROM    sample_table t
WHERE   t.user_id = 2
        AND t.group_id = 12
), 'no')

Outras dicas

Se você deseja que o conjunto vazio para representar um "não" caso, você provavelmente poderia fazer isso em vez disso:

select ... where ... (foo = 'no' or foo is null)

Este iria lidar com ambos os casees sem ter que mudar drasticamente o seu subconsulta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top