Si en la tabla existe un id = 1, esa consulta jamás devolverá datos, a causa de que en el momento en que se evalua el WHERE, @foo es NULL.
Como la asignación es dinámica, el valor de las variables del SELECT sólo se asigna sobre los datos resultado. Pero como para el momento evaluar el WHERE, aún no se le asignó valor alguno a @foo, la consulta no devuelve dato alguno (no, NULL
no es un dato, es un estado).
Es tan evidente esto, que si le asignas un valor de espacio vacío a @foo antes de la operación, esta si da resultados:
Código MySQL:
Ver originalQuery OK, 0 rows affected (0.00 sec)
->
-> @var
:=IF(1=1,'si','no') var
, -> @foo
:=IF(@var
='si','hola','adios') foo
+-----+------+
| var | foo |
+-----+------+
| si | hola |
+-----+------+