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型の列として認識される。