blob: 3ae7f219f8f32a2d21f2e45461f4d40750f10f75 [file] [log] [blame]
--
-- CASE ... WHEN IS NOT DISTINCT FROM ...
--
INSERT INTO mytable values (1,2,'t'),
(2,3,'e'),
(3,4,'o'),
(4,5,'o'),
(4,4,'o'),
(5,5,'t'),
(6,6,'t'),
(7,6,'a'),
(8,7,'t'),
(9,8,'a');
CREATE OR REPLACE FUNCTION negate(int) RETURNS int
AS 'SELECT $1 * (-1)'
LANGUAGE sql
IMMUTABLE
RETURNS null ON null input;
DROP VIEW IF EXISTS myview;
CREATE VIEW myview AS
SELECT a,b, CASE a WHEN IS NOT DISTINCT FROM b THEN b*10
WHEN IS NOT DISTINCT FROM b+1 THEN b*100
WHEN b-1 THEN b*1000
WHEN b*10 THEN b*10000
WHEN negate(b) THEN b*(-1.0)
ELSE b END AS newb
FROM mytable;
SELECT * FROM myview ORDER BY a,b;
-- Test deparse
select pg_get_viewdef('myview',true);
-- User-defined DECODE function
CREATE OR REPLACE FUNCTION "decode"(int, int, int) RETURNS int
AS 'select $1 * $2 - $3;'
LANGUAGE sql
IMMUTABLE
RETURNS null ON null input;
SELECT decode(11,8,11);
SELECT "decode"(11,8,11);
-- Test CASE x WHEN IS NOT DISTINCT FROM y with DECODE
SELECT a,b,decode(a,1,1),
CASE decode(a,1,1) WHEN IS NOT DISTINCT FROM 1 THEN b*100
WHEN IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb
FROM mytable ORDER BY a,b;
-- Test CASE WHEN x IS NOT DISTINCT FROM y with DECODE
SELECT a,b,decode(a,1,1),
CASE WHEN decode(a,1,1) IS NOT DISTINCT FROM 1 THEN b*100
WHEN decode(a,1,1) IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb
FROM mytable ORDER BY a,b;
SELECT a,b,"decode"(a,1,1),
CASE WHEN "decode"(a,1,1) IS NOT DISTINCT FROM 1 THEN b*100
WHEN "decode"(a,1,1) IS NOT DISTINCT FROM 4 THEN b*1000 ELSE b END as newb
FROM mytable ORDER BY a,b;
--
-- Case expression in group by
--
SELECT
CASE t.field1
WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying
ELSE t.field1
END AS field1
FROM ( SELECT 'test value'::text AS field1) t
GROUP BY
CASE t.field1
WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying
ELSE t.field1
END;
--
-- Variant of case expression in group by
--
SELECT
CASE t.field1
WHEN IS NOT DISTINCT FROM ''::text THEN 'Undefined'::character varying
ELSE t.field1
END AS field1
FROM ( SELECT 'test value'::text AS field1) t
GROUP BY 1;
--
-- decode in group by
--
SELECT
decode(t.field1, ''::text, 'Undefined'::character varying, t.field1) as field1
FROM ( SELECT 'test value'::text AS field1) t
GROUP BY
decode(t.field1, ''::text, 'Undefined'::character varying, t.field1);
--
-- variant of decode in group by
--
SELECT
decode(t.field1, ''::text, 'Undefined'::character varying, t.field1) as field1
FROM ( SELECT 'test value'::text AS field1) t
GROUP BY 1;
--
-- clean up
--
DROP FUNCTION "decode"(int, int, int);