J'ai lutté sur le même problème et "la syntaxe mysql n'est pas standard" n'est pas un argument valable à mon avis. PostgreSQL ajoute également des extensions non standard pratiques, par exemple "INSERT ... RETURNING ..." pour obtenir des identifiants automatiques après les insertions. De plus, répéter des requêtes volumineuses n'est pas une solution élégante.
Cependant, j'ai trouvé l'instruction WITH très utile (CTE). Cela crée en quelque sorte une vue temporaire dans la requête que vous pouvez ensuite utiliser comme une table habituelle. Je ne sais pas si j'ai correctement réécrit votre JOIN, mais en général, cela devrait fonctionner comme ceci :
WITH jobs_refined AS (
SELECT
jobs.*,
(SELECT CASE WHEN lead_informations.state IS NOT NULL THEN lead_informations.state ELSE 'NEW' END) AS lead_state
FROM jobs
LEFT JOIN lead_informations
ON lead_informations.job_id = jobs.id
AND lead_informations.mechanic_id = 3
)
SELECT *
FROM jobs_refined
WHERE lead_state = 'NEW'