以下のように、複数のパラメーターを持つ関数を作成しようとしています。
CREATE OR REPLACE FUNCTION select_name_and_date (
IN f_name character,
IN m_name character,
IN l_name character,
IN start_date date,
IN end_date date )
RETURNS TABLE (
start_date date ,first_name character, middle_name character,last_name character ) AS $BODY$
BEGIN RETURN QUERY
select a.start_date, a.first_name, a.middle_name, a.last_name
FROM table1 a
where code in ('NEW', 'OLD')
and ( (a.first_name like '%' || f_name || '%' and a.middle_name like '%' || m_name || '%' and a.last_name like '%' || l_name || '%'))
or ((a.date_applied) between start_date and end_date );
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
日付で実行しようとすると、正しい結果が表示されます。
select * from select_name_and_date ('Firstname','','','2016-06-27','2016-06-28');
日付の値を削除しようとすると、次のように表示されます。エラー:日付型の入力構文が無効です: ""
select * from select_name_and_date ('Firstname','','','','');
日付のNULL値に置き換えようとすると、次のように表示されます。0行が取得されました。(あるべきとき)
select * from select_name_and_date ('Firstname','','',NULL,NULL);
各パラメータに依存しないパラメータが欲しいのですが。
between
オペレータは処理しないnull
のを。それらを許可したい場合は、明示的に扱う必要があります。たとえば、適用さa.date_applied
れる条件の一部を次のように書き直すことができます。
((a.date_applied BETWEEN start_date AND end_date) OR
(start_date IS NULL AND a.date_applied < end_date) OR
(end_date IS NULL AND a.date_applied >= end_date) OR
(start_date IS NULL AND end_date IS NULL))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加