UNION ALLで疑似テーブルを作るときの WHERE句 1=0 指定

SQLで よくWHERE句の先頭で、1=1 を書いて、後続条件を AND ~ を並べやすくして
メンテナンスしやすくする手法は良くある。でも、1=0 というわざわざ否定を書くことは少ない。
UNION ALLで疑似テーブルを作るケースは、

WITH sales AS (
    SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM 
    UNION ALL SELECT '01' AS SCODE,'みかん' AS ITEM,10 AS SALE_NUM FROM dual
    UNION ALL SELECT '02' AS SCODE,'バナナ' AS ITEM,12 AS SALE_NUM FROM dual
    UNION ALL SELECT '04' AS SCODE,'レモン' AS ITEM,16 AS SALE_NUM FROM dual
)
SELECT SCODE, ITEM, SALE_NUM
FROM sales

このように全部のレコードのSELECT で AS 列名を書くのはめんどうである。
WHERE句 1=0 という通常指定しないWHERE句を書いて、先頭のSELECT だけ AS 列名を書くことができる。

WITH sales AS (
    SELECT ' ' AS SCODE, ' ' AS ITEM, 0 AS SALE_NUM FROM dual WHERE 1=0
    UNION ALL SELECT '01' AS SCODE,'みかん' AS ITEM,10 AS SALE_NUM FROM dual
    UNION ALL SELECT '02' AS SCODE,'バナナ' AS ITEM,12 AS SALE_NUM FROM dual
    UNION ALL SELECT '04' AS SCODE,'レモン' AS ITEM,16 AS SALE_NUM FROM dual
)
SELECT SCODE, ITEM, SALE_NUM
FROM sales

Oracleの場合このAS句を NULL AS 列名で書くことは型が不明のエラーになってできない。
他のDBは NULL AS 列名が可能だ。

PostgreSQL 、MySQL の場合

WITH sales AS (
    SELECT null AS SCODE, null AS ITEM, null AS SALE_NUM  WHERE 1=0
    UNION ALL SELECT '01','みかん',10 
    UNION ALL SELECT '01','バナナ',12 
    UNION ALL SELECT '01','レモン',16 
)
SELECT SCODE, ITEM, SALE_NUM
FROM sales

Oracleと違って NULL に対して AS句を書ける。
Oracle では疑似テーブルの生成でレコード無し(件数=0)、以下の記述は
列の型が不明でエラーになるが、
PostgreSQL 、MySQL では、エラーにならない。

WITH sales AS (
    SELECT null AS SCODE, null AS ITEM, null AS SALE_NUM  WHERE 1=0
)
SELECT SCODE, ITEM, SALE_NUM
FROM sales

値が存在するレコードを書かないこの書き方では、
PostgreSQL は、全て TEXT型の列として認識される。
MySQL は、全て BINARY型の列として認識される。