How to return a missing field as null with db_select union?
I used the addField function to explicitely declare the NULL aliased columns for the UNION. It worked!
Check the following snippet:

$table_one = db_select('users', 't_o');
$table_one-&gt;addField('t_o', 'uid', 'id');
$table_one-&gt;addField('t_o', 'name');
$table_one-&gt;addField(NULL, 'null', 'weight');
$table_one-&gt;addField('t_o','mail');

$table_two = db_select('taxonomy_term_data"', 'tw');
$table_two-&gt;addfield('tw', 'tid', 'id');
$table_two-&gt;addfield('tw', 'name');
$table_two-&gt;addfield('tw', 'weight');
$table_two-&gt;addField(NULL, 'null', 'mail');

$s_query = db_select($table_one-&gt;union($table_two), 't')
    -&gt;fields('t', array('id', 'name', 'weight', 'mail'));


And this generates this kind of SQL:

SELECT t.id AS id, t.name AS name, t.weight AS weight, t.mail AS mail
FROM
  (SELECT t_o.uid AS id, t_o.name AS name, null AS weight, t_o.mail AS mail
   FROM {users} t_o 
   UNION 
   SELECT tw.tid AS id, tw.name AS name, tw.weight AS weight, null AS mail
   FROM {taxonomy_term_data} tw)


Hope this solves your problem!