-- -- TEXT -- SELECT text 'this is a text string' = text 'this is a text string' AS true; true ------ t (1 row) SELECT text 'this is a text string' = text 'this is a text strin' AS false; false ------- f (1 row) CREATE TABLE TEXT_TBL (f1 text); INSERT INTO TEXT_TBL VALUES ('doh!'); INSERT INTO TEXT_TBL VALUES ('hi de ho neighbor'); SELECT '' AS two, * FROM TEXT_TBL; two | f1 -----+------------------- | doh! | hi de ho neighbor (2 rows) -- As of 8.3 we have removed most implicit casts to text, so that for example -- this no longer works: select length(42); ERROR: function length(integer) does not exist LINE 1: select length(42); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. -- But as a special exception for usability's sake, we still allow implicit -- casting to text in concatenations, so long as the other input is text or -- an unknown literal. So these work: select 'four: '::text || 2+2; ?column? ---------- four: 4 (1 row) select 'four: ' || 2+2; ?column? ---------- four: 4 (1 row) -- but not this: select 3 || 4.0; ERROR: operator does not exist: integer || numeric LINE 1: select 3 || 4.0; ^ HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts. /* * various string functions */ select concat('one'); concat -------- one (1 row) select concat(1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); concat ---------------------- 123hellotf03-09-2010 (1 row) select concat_ws('#','one'); concat_ws ----------- one (1 row) select concat_ws('#',1,2,3,'hello',true, false, to_date('20100309','YYYYMMDD')); concat_ws ---------------------------- 1#2#3#hello#t#f#03-09-2010 (1 row) select concat_ws(',',10,20,null,30); concat_ws ----------- 10,20,30 (1 row) select concat_ws('',10,20,null,30); concat_ws ----------- 102030 (1 row) select concat_ws(NULL,10,20,null,30) is null; ?column? ---------- t (1 row) select reverse('abcde'); reverse --------- edcba (1 row) select i, left('ahoj', i), right('ahoj', i) from generate_series(-5, 5) t(i) order by i; i | left | right ----+------+------- -5 | | -4 | | -3 | a | j -2 | ah | oj -1 | aho | hoj 0 | | 1 | a | j 2 | ah | oj 3 | aho | hoj 4 | ahoj | ahoj 5 | ahoj | ahoj (11 rows) select quote_literal(''); quote_literal --------------- '' (1 row) select quote_literal('abc'''); quote_literal --------------- 'abc''' (1 row) select quote_literal(e'\\'); quote_literal --------------- E'\\' (1 row) /* * format */ select format(NULL); format -------- (1 row) select format('Hello'); format -------- Hello (1 row) select format('Hello %s', 'World'); format ------------- Hello World (1 row) select format('Hello %%'); format --------- Hello % (1 row) select format('Hello %%%%'); format ---------- Hello %% (1 row) -- should fail select format('Hello %s %s', 'World'); ERROR: too few arguments for format conversion select format('Hello %s'); ERROR: too few arguments for format conversion select format('Hello %x', 20); ERROR: unrecognized conversion specifier: x -- check literal and sql identifiers select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, 'Hello'); format ---------------------------------------- INSERT INTO mytab VALUES('10','Hello') (1 row) select format('%s%s%s','Hello', NULL,'World'); format ------------ HelloWorld (1 row) select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', 10, NULL); format ------------------------------------- INSERT INTO mytab VALUES('10',NULL) (1 row) select format('INSERT INTO %I VALUES(%L,%L)', 'mytab', NULL, 'Hello'); format ---------------------------------------- INSERT INTO mytab VALUES(NULL,'Hello') (1 row) -- should fail, sql identifier cannot be NULL select format('INSERT INTO %I VALUES(%L,%L)', NULL, 10, 'Hello'); ERROR: NULL cannot be escaped as an SQL identifier -- check positional placeholders select format('%1$s %3$s', 1, 2, 3); format -------- 1 3 (1 row) select format('%1$s %12$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); format -------- 1 12 (1 row) -- should fail select format('%1$s %4$s', 1, 2, 3); ERROR: too few arguments for format conversion select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12); ERROR: too few arguments for format conversion select format('%1s', 1); ERROR: unterminated conversion specifier select format('%1$', 1); ERROR: unterminated conversion specifier select format('%1$1', 1); ERROR: unrecognized conversion specifier: 1 --checkk mix of positional and ordered placeholders select format('Hello %s %1$s %s', 'World', 'Hello again'); format ------------------------------- Hello World World Hello again (1 row) select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again'); format -------------------------------------------------- Hello World Hello again, Hello again Hello again (1 row)