NULLを使わずに済めばいいけど、テーブル結合とかで出る可能性を考慮せざるを得ません。で時々使うのが、配列にNULLを足しても変化しない ↓ 仕様。|| 演算子はSQL標準での文字列連結ですが、PostgreSQLでは配列の連結にも使われてます。(以下、バージョン9.5.3で動作確認)。
# select array[1, 2, 3] || NULL;
+----------+
| ?column? |
+----------+
| {1,2,3}  |
+----------+
(1 row)

# select '{あ, い, う}' :: text[] || NULL; 
+------------+
|  ?column?  |
+------------+
| {あ,い,う} |
+------------+
(1 row)


逆に明示的にNULLを入れたい時は ↓ 微妙な違いですが、NULLを配列要素の型にキャストして追加します。
# select array[1, 2, 3] || NULL :: int;
+--------------+
|   ?column?   |
+--------------+
| {1,2,3,NULL} |
+--------------+
(1 row)

# select '{あ, い, う}' :: text[] || NULL :: text; 
+-----------------+
|    ?column?     |
+-----------------+
| {あ,い,う,NULL} |
+-----------------+
(1 row)


上と同じ結果は「NULLという要素1つの配列」を作り、足す先の配列の型に合わせて追加しても ↓ 得られます。
# select array[1, 2, 3] || '{NULL}' :: int[];
+--------------+
|   ?column?   |
+--------------+
| {1,2,3,NULL} |
+--------------+
(1 row)

# select '{あ, い, う}' :: text[] || '{NULL}' :: text[]; 
+-----------------+
|    ?column?     |
+-----------------+
| {あ,い,う,NULL} |
+-----------------+
(1 row)


ここまでは何となく認識してましたが、今日の本題はCASE句との組み合わせ。CASE句でWHEN条件だけ指定すると、他の条件はNULLになります。↓
# select
      case when to_char(now(), 'Dy') = 'Sat' then '土曜日' end;
+------+
| case |
+------+
|      |
+------+
(1 row)

-- 上が空文字でなくNULLである確認 ↓
# select
      (case when to_char(now(), 'Dy') = 'Sat' then '土曜日' end) is null; 
+----------+
| ?column? |
+----------+
| t        |
+----------+
(1 row)


こういうCASE句を配列に足す時の挙動で、最近ちょっと嵌まりました。CASE句の結果がNULLの時は元の配列が変化しないと思い込み。ところが実際は ↓
# select '{月, 火, 水}' :: text[]
      || case when to_char(now(), 'Dy') = 'Sat' then '土' end; 
+-----------------+
|    ?column?     |
+-----------------+
| {月,火,水,NULL} |
+-----------------+
(1 row)


あれ、余計なNULLが追加されてる。どうやらCASE句のWHEN以外の結果が ↓ こういう風に自動的になってる模様。
# select '{月, 火, 水}' :: text[]
      || (case when to_char(now(), 'Dy') = 'Sat'
          then '土' else NULL :: text end); 
+-----------------+
|    ?column?     |
+-----------------+
| {月,火,水,NULL} |
+-----------------+
(1 row)


う~、普段のように「値があれば配列に加え、NULLなら元配列を変えない」ってしたいなぁ。で少し悩んだけど、方法が見つかりました。↓
# select '{月, 火, 水}' :: text[]
      || (case when to_char(now(), 'Dy') = 'Sat'
          then '{土}' :: text[] end); 
+------------+
|  ?column?  |
+------------+
| {月,火,水} |
+------------+
(1 row)

# select array[1, 2, 3]
      || (case when to_char(now(), 'Dy') = 'Sat'
          then array[4] end);
+----------+
| ?column? |
+----------+
| {1,2,3}  |
+----------+
(1 row)


CASE句のWHEN条件が真になる場合は、期待どおり配列に追加されます。↓
# select '{月, 火, 水}' :: text[]
      || (case when to_char(now(), 'Dy') = 'Fri'
          then '{土}' :: text[] end);
+---------------+
|   ?column?    |
+---------------+
| {月,火,水,土} |
+---------------+
(1 row)

# select array[1, 2, 3]
      || (case when to_char(now(), 'Dy') = 'Fri' 
          then array[4] end);
+-----------+
| ?column?  |
+-----------+
| {1,2,3,4} |
+-----------+
(1 row)


他にもCASE句全体をキャストしたり試しましたが、エラーになる場合が結構あり。まだ理解不十分なので、まとめは今後の宿題にします。とりあえず配列にNULLを足した際の結果は2通りあり、CASE句の結果を足す場合は特に注意というメモまで。