2000-01-04 17:19:34 +01:00
|
|
|
--
|
|
|
|
-- TEXT
|
|
|
|
--
|
|
|
|
SELECT text 'this is a text string' = text 'this is a text string' AS true;
|
|
|
|
true
|
|
|
|
------
|
|
|
|
t
|
1997-04-05 13:24:54 +02:00
|
|
|
(1 row)
|
|
|
|
|
2000-01-04 17:19:34 +01:00
|
|
|
SELECT text 'this is a text string' = text 'this is a text strin' AS false;
|
|
|
|
false
|
|
|
|
-------
|
|
|
|
f
|
1997-04-05 13:24:54 +02:00
|
|
|
(1 row)
|
|
|
|
|
2022-02-08 21:30:38 +01:00
|
|
|
-- text_tbl was already created and filled in test_setup.sql.
|
2020-12-15 21:54:06 +01:00
|
|
|
SELECT * FROM TEXT_TBL;
|
|
|
|
f1
|
|
|
|
-------------------
|
|
|
|
doh!
|
|
|
|
hi de ho neighbor
|
1997-12-01 03:44:53 +01:00
|
|
|
(2 rows)
|
|
|
|
|
2007-06-07 01:00:50 +02:00
|
|
|
-- 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;
|
|
|
|
^
|
2017-08-23 19:56:59 +02:00
|
|
|
HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
|
2010-08-24 08:30:44 +02:00
|
|
|
/*
|
2010-11-22 02:46:54 +01:00
|
|
|
* various string functions
|
2010-08-24 08:30:44 +02:00
|
|
|
*/
|
|
|
|
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)
|
|
|
|
|
2010-11-22 02:46:54 +01:00
|
|
|
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)
|
|
|
|
|
2013-01-25 06:19:18 +01:00
|
|
|
-- check variadic labeled argument
|
|
|
|
select concat(variadic array[1,2,3]);
|
|
|
|
concat
|
|
|
|
--------
|
|
|
|
123
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select concat_ws(',', variadic array[1,2,3]);
|
|
|
|
concat_ws
|
|
|
|
-----------
|
|
|
|
1,2,3
|
|
|
|
(1 row)
|
|
|
|
|
2013-07-18 17:52:12 +02:00
|
|
|
select concat_ws(',', variadic NULL::int[]);
|
2013-01-25 06:19:18 +01:00
|
|
|
concat_ws
|
|
|
|
-----------
|
|
|
|
|
|
|
|
(1 row)
|
|
|
|
|
2013-07-18 17:52:12 +02:00
|
|
|
select concat(variadic NULL::int[]) is NULL;
|
2013-01-25 06:19:18 +01:00
|
|
|
?column?
|
|
|
|
----------
|
|
|
|
t
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select concat(variadic '{}'::int[]) = '';
|
|
|
|
?column?
|
|
|
|
----------
|
|
|
|
t
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
--should fail
|
|
|
|
select concat_ws(',', variadic 10);
|
|
|
|
ERROR: VARIADIC argument must be an array
|
2013-07-18 17:52:12 +02:00
|
|
|
LINE 1: select concat_ws(',', variadic 10);
|
|
|
|
^
|
2010-11-22 02:46:54 +01:00
|
|
|
/*
|
|
|
|
* format
|
|
|
|
*/
|
2010-11-20 06:21:17 +01:00
|
|
|
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');
|
2016-08-08 14:15:41 +02:00
|
|
|
ERROR: too few arguments for format()
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('Hello %s');
|
2016-08-08 14:15:41 +02:00
|
|
|
ERROR: too few arguments for format()
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('Hello %x', 20);
|
2016-02-11 16:11:11 +01:00
|
|
|
ERROR: unrecognized format() type specifier "x"
|
|
|
|
HINT: For a single "%" use "%%".
|
2010-11-20 06:21:17 +01:00
|
|
|
-- 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');
|
2011-07-04 23:01:35 +02:00
|
|
|
ERROR: null values cannot be formatted as an SQL identifier
|
2010-11-20 06:21:17 +01:00
|
|
|
-- 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
|
2010-11-20 16:04:48 +01:00
|
|
|
(1 row)
|
|
|
|
|
2010-11-20 06:21:17 +01:00
|
|
|
-- should fail
|
|
|
|
select format('%1$s %4$s', 1, 2, 3);
|
2016-08-08 14:15:41 +02:00
|
|
|
ERROR: too few arguments for format()
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('%1$s %13$s', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
|
2016-08-08 14:15:41 +02:00
|
|
|
ERROR: too few arguments for format()
|
2013-03-15 03:56:56 +01:00
|
|
|
select format('%0$s', 'Hello');
|
|
|
|
ERROR: format specifies argument 0, but arguments are numbered from 1
|
|
|
|
select format('%*0$s', 'Hello');
|
|
|
|
ERROR: format specifies argument 0, but arguments are numbered from 1
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('%1$', 1);
|
2016-02-11 16:11:11 +01:00
|
|
|
ERROR: unterminated format() type specifier
|
|
|
|
HINT: For a single "%" use "%%".
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('%1$1', 1);
|
2016-02-11 16:11:11 +01:00
|
|
|
ERROR: unterminated format() type specifier
|
|
|
|
HINT: For a single "%" use "%%".
|
2013-01-25 06:19:18 +01:00
|
|
|
-- check mix of positional and ordered placeholders
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('Hello %s %1$s %s', 'World', 'Hello again');
|
|
|
|
format
|
|
|
|
-------------------------------
|
|
|
|
Hello World World Hello again
|
2010-11-20 16:04:48 +01:00
|
|
|
(1 row)
|
|
|
|
|
2010-11-20 06:21:17 +01:00
|
|
|
select format('Hello %s %s, %2$s %2$s', 'World', 'Hello again');
|
|
|
|
format
|
|
|
|
--------------------------------------------------
|
|
|
|
Hello World Hello again, Hello again Hello again
|
2010-11-20 16:04:48 +01:00
|
|
|
(1 row)
|
|
|
|
|
2013-01-25 06:19:18 +01:00
|
|
|
-- check variadic labeled arguments
|
|
|
|
select format('%s, %s', variadic array['Hello','World']);
|
|
|
|
format
|
|
|
|
--------------
|
|
|
|
Hello, World
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('%s, %s', variadic array[1, 2]);
|
|
|
|
format
|
|
|
|
--------
|
|
|
|
1, 2
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('%s, %s', variadic array[true, false]);
|
|
|
|
format
|
|
|
|
--------
|
|
|
|
t, f
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('%s, %s', variadic array[true, false]::text[]);
|
|
|
|
format
|
|
|
|
-------------
|
|
|
|
true, false
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- check variadic with positional placeholders
|
|
|
|
select format('%2$s, %1$s', variadic array['first', 'second']);
|
|
|
|
format
|
|
|
|
---------------
|
|
|
|
second, first
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('%2$s, %1$s', variadic array[1, 2]);
|
|
|
|
format
|
|
|
|
--------
|
|
|
|
2, 1
|
|
|
|
(1 row)
|
|
|
|
|
2013-07-18 17:52:12 +02:00
|
|
|
-- variadic argument can be array type NULL, but should not be referenced
|
|
|
|
select format('Hello', variadic NULL::int[]);
|
2013-01-25 06:19:18 +01:00
|
|
|
format
|
|
|
|
--------
|
|
|
|
Hello
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
-- variadic argument allows simulating more than FUNC_MAX_ARGS parameters
|
|
|
|
select format(string_agg('%s',','), variadic array_agg(i))
|
|
|
|
from generate_series(1,200) g(i);
|
|
|
|
format
|
|
|
|
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200
|
|
|
|
(1 row)
|
|
|
|
|
2013-03-15 03:56:56 +01:00
|
|
|
-- check field widths and left, right alignment
|
|
|
|
select format('>>%10s<<', 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> Hello<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%10s<<', NULL);
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%10s<<', '');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%-10s<<', '');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%-10s<<', 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>>Hello <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%-10s<<', NULL);
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%1$10s<<', 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> Hello<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%1$-10I<<', 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>>"Hello" <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%2$*1$L<<', 10, 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> 'Hello'<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%2$*1$L<<', 10, NULL);
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> NULL<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%2$*1$L<<', -10, NULL);
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>>NULL <<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%*s<<', 10, 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> Hello<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%*1$s<<', 10, 'Hello');
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> Hello<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%-s<<', 'Hello');
|
|
|
|
format
|
|
|
|
-----------
|
|
|
|
>>Hello<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%10L<<', NULL);
|
|
|
|
format
|
|
|
|
----------------
|
|
|
|
>> NULL<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%2$*1$L<<', NULL, 'Hello');
|
|
|
|
format
|
|
|
|
-------------
|
|
|
|
>>'Hello'<<
|
|
|
|
(1 row)
|
|
|
|
|
|
|
|
select format('>>%2$*1$L<<', 0, 'Hello');
|
|
|
|
format
|
|
|
|
-------------
|
|
|
|
>>'Hello'<<
|
|
|
|
(1 row)
|
|
|
|
|