V tomto díle budou ukázány funkce pro zpracování obsahu textových řetězců a funkce pro zpracování binárních řetězců.
18.4.2005 15:00 | MaReK Olšavský | přečteno 24014×
PostgreSQL nabízí mnoho funkcí pro zpracování řetezců na straně serveru, které jsou samozřejmě řešitelné i ve scriptu, nebo programu, ale jak již bylo uvedeno jejich použití v SQL dotazech je rychlejší a lze ušetřit přenos mnoha redundantních dat. Stejně jako u matematických funkcí lze funkce zanořovat do sebe.
funkce | typ návratové hodnoty | popis | příklad |
---|---|---|---|
(text1)||(text2) | text | Spojení řetězců | SELECT 'ahoj '||'světe' |
bit_length(text) | integer | Délka řetězce v bitech | SELECT bit_lentgh('Serial pisu na Apple iBook') |
char_length(text) character_length(text) |
integer | Počet znaků v řetězci | SELECT char_length('Penguin') |
convert(text using conversion_name) | text | Převod mezi kódovými tabulkami, conversion_name je definován pomocí CREATE CONVERSION, převody, které jsou k dispozici bez předefinování jsou v další tabulce | SELECT CONVERT('chrastění' USING iso_8859_2_to_utf_8) |
Lower(text) | text | Převod všechznaků v řetězci na minusky (malá písmena) | SELECT LOWER('Volání RODU z Osady u řeky') |
octet_length(text) | integer | Délka řetězce v bytech | SELECT OCTET_LENGTH('Gentoo Rules') |
overlay(text1 placing text2 from integer1 [for integer]) | text | Řetězec2 je vložen do řetězce1 od znaku číslo integer1 (konec je odříznut), je-li uveden parametr for, je v původním řetězci nahrazeno integer2 znaků od pozice integer1 | SELECT OVERLAY('ekonomika' PLACING 'conomi' FROM 2 FOR 7); |
position(castextu in text) | integer | Pozice prvního znaku řetězce castextu v text | SELECT POSITION('pp' IN 'apple'; |
substring(text [from integer][for integer] | text | Vrací část řetězce, není-li uveden parametr from, je vrácena část od 1. znaku, parametr for udává kolik znaků bude vráceno není-li uveden parametr for, budou vráceny všechny znaky do konce řetězce. | SELECT SUBSTRING('kubuntu',2) |
substring(text from vzorek) | text | Vrací část řetězce, část řetězce musí odpovídat vzorku podle regulárního výrazu podle normy POSIX | SELECT SUBSTRING('Kubuntu' FROM '^...'); |
substring(text from vzorek for escape) | text | Vrací část řetězce, podobné, jako předchozí případ, ale podle normy SQL | |
trim([leading|trailing|both][znaky] from text) | text | Oříznutí znaků z řetězce, podle direktivy zepředu, z konce, či s obou stran řetězce | SELECT TRIM(LEADING 'u' FROM 'ubuntu'); |
upper(text) | text | Převod řetězce na verzálky (velká písmena) | SELECT UPPER('Mandrake LiNux'); |
ascii(text) | integer | ASCII kód prvního znaku z řetězce | SELECT ASCII('S'); |
btrim(text1, text2) | text | Oboustranné oříznutí nejdelší kombinace znaků uvedené v parametru text2 z řetězce text2 | SELECT BTRIM('acbacpepacccaacba','abc'); |
chr(integer) | znak | Znak, který odpovídá ascii kódu předanému v parametru | SELECT CHR(67); |
convert(text1, zdroj_kódování, cílové_kódování) | text | Převod řetězce ze zdrojové do cílové znakové sady | SELECT CONVERT('žížala','LATIN2','UNICODE'); |
decode(text, typ) | bytea | Převod binárních dat do řetězce, typ je jeden z base64, hex, escape | SELECT DECODE('4e696b697461','hex') |
encode(data, typ) | text | Převod řetězce na binární data, inverzní funkce vůči decode, vstupní parametr je typu bytea | SELECT ENCODE('Nikita','hex') |
initcap(text) | text | Zkonveruje první písmeno každého slova na verzálku | SELECT INITCAP('Mary měla jehňátko'); |
length(text) | integer | Délka řetězce | SELECT LENGTH('Řetězec ke spočítání délky'); |
lpad(text, length, text2) | text | Doplnění řetězce v parametru text řetězcem text2 na délku length, pokud je doplňující řetězec nestačí k doplnění na potřebnou délku, je cyklicky opakován, jestliže je součet obou řetězců delší, je doplnující řetězec oříznut. | SELECT LPAD('Ubuntu',25,' je nejzajímavější Debian based distro...'); |
ltrim(text, text2) | text | Z řetězce v parametru text jsou zleva oříznuty veškeré znaky, které jsou v parametru text2 | SELECT LTRIM('xxxuaMephisaa','xua'); |
pg_client_encoding() | name | Aktuální kódová stránka na straně klienta | |
quote_ident(text) | text | Vrací řetězec v uvozovkách, aby byl použitelný jako SQL identifikátor. Řetězec je vložen do uvozovek jen v nutných nutných případech, vložené uvozovky jsou zdvojené | SELECT QUOTE_IDENT('tučňákovo zákoutí'); |
quote_literal(text) | text | Vrací řetězec v apostrofech pro použití jako řetězec, vnořené apostrofy jsou zdvojeny | SELECT QUOTE_LITERAL ('O\'Hara'); |
repeat(text, integer) | text | Zopakuje řetězec | SELECT REPEAT('ahoj ',2); |
replace(text, text2, text3) | text | Nahradí v řetězci text všechny výskyty text2 řetězcem text3 | SELECT REPLACE('Ubaktu','ak','un'); |
rpad(text, integer, text) | text | Ekvivalentní lpad, ale dopňuje zprava | |
rtrim(text, text) | text | Ekvivalentní ltrim, ale odstraňuje zprava | |
split_part(text, text2, integer) | text | Z textu text obsahujícího oddělovače text2 vrátí část, která má pořadové číslo integer | SELECT SPLIT_PART('ovoce;kiwi;ks;3',';',4) AS jednotkovacena |
strpos(text, text2) | integer | Vyhledá podřetězec, ekvivalentní funkci position, ale parametry jsou obráceně | SELECT STRPOS('LinuxFromScratch','xf'); |
substr(text, integer1, integer2) | text | Vrací podřetězec, ekvivalentní funkci substring | SELECT substr('Arch Linux',1,4); |
to_ascii(text, encoding) | text | Převod z kódování určeného parametrem encoding do ASCII, funguje jen pro kódování LATIN1, LATIN2 a WIN1250, od verze PgSQL i LATIN9 | SELECT TO_ASCII('Řeřicha', LATIN2); |
to_hex(integer nebo bigint) | text | Převod čísla do jeho hexadecimálního tvaru | SELECT TO_HEX(678992); |
translate(text, text2, text3) | text | Znaky z text, které odpovídají znakům z text2, jsou nahrazeny znaky z text3 na odpovídající pozici | SELECT TRANSLATE('aleceta','lt','bd') |
Funkce convert slouží k převodu mezi kódovými stránkami, konverzní názvy jsou v prostém seznamu bez dalšího vysvětlování. Logika tvoření těchto názvů je vychozikodovani_to_cilovekofovani. Seznam konverzních jmen: ascii_to_mic, ascii_to_utf_8, big5_to_euc_tw, big5_to_mic, big5_to_utf_8, euc_cn_to_mic, euc_cn_to_utf_8, euc_jp_to_mic, euc_jp_to_sjis, euc_jp_to_utf_8, euc_kr_to_mic, euc_kr_to_utf_8, euc_tw_to_big5, euc_tw_to_mic, euc_tw_to_utf_8, gb18030_to_utf_8, gbk_to_utf_8, iso_8859_10_to_utf_8, iso_8859_13_to_utf_8, iso_8859_14_to_utf_8, iso_8859_15_to_utf_8, iso_8859_16_to_utf_8, iso_8859_1_to_mic, iso_8859_1_to_utf_8, iso_8859_2_to_mic, iso_8859_2_to_utf_8, iso_8859_2_to_windows_1250, iso_8859_3_to_mic, iso_8859_3_to_utf_8, iso_8859_4_to_mic, iso_8859_4_to_utf_8, iso_8859_5_to_koi8_r, iso_8859_5_to_mic, iso_8859_5_to_utf_8, iso_8859_5_to_windows_1251, iso_8859_5_to_windows_866, iso_8859_6_to_utf_8, iso_8859_7_to_utf_8, iso_8859_8_to_utf_8, iso_8859_9_to_utf_8, johab_to_utf_8, koi8_r_to_iso_8859_5, koi8_r_to_mic, koi8_r_to_utf_8, koi8_r_to_windows_1251, koi8_r_to_windows_866, mic_to_ascii, mic_to_big5, mic_to_euc_cn, mic_to_euc_jp, mic_to_euc_kr, mic_to_euc_tw, mic_to_iso_8859_1, mic_to_iso_8859_2, mic_to_iso_8859_3, mic_to_iso_8859_4, mic_to_iso_8859_5, mic_to_koi8_r, mic_to_sjis, mic_to_windows_1250, mic_to_windows_1251, mic_to_windows_866, sjis_to_euc_jp, sjis_to_mic, sjis_to_utf_8, tcvn_to_utf_8, uhc_to_utf_8, utf_8_to_ascii, utf_8_to_big5, utf_8_to_euc_cn, utf_8_to_euc_jp, utf_8_to_euc_kr, utf_8_to_euc_tw, utf_8_to_gb18030, utf_8_to_gbk, utf_8_to_iso_8859_1, utf_8_to_iso_8859_10, utf_8_to_iso_8859_13, utf_8_to_iso_8859_14, utf_8_to_iso_8859_15, utf_8_to_iso_8859_16, utf_8_to_iso_8859_2, utf_8_to_iso_8859_3, utf_8_to_iso_8859_4, utf_8_to_iso_8859_5, utf_8_to_iso_8859_6, utf_8_to_iso_8859_7, utf_8_to_iso_8859_8, utf_8_to_iso_8859_9, utf_8_to_johab, utf_8_to_koi8_r, utf_8_to_sjis, utf_8_to_tcvn, utf_8_to_uhc, utf_8_to_windows_1250, utf_8_to_windows_1251, utf_8_to_windows_1256, utf_8_to_windows_866, utf_8_to_windows_874, windows_1250_to_iso_8859_2, windows_1250_to_mic, windows_1250_to_utf_8, windows_1251_to_iso_8859_5, windows_1251_to_koi8_r, windows_1251_to_mic, windows_1251_to_utf_8, windows_1251_to_windows_866, windows_1256_to_utf_8, windows_866_to_iso_8859_5, windows_866_to_koi8_r, windows_866_to_mic, windows_866_to_utf_8, windows_866_to_windows_1251, windows_874_to_utf_8.
PostgreSQL kromě standardních textových řetězců podporuje i řetězce binární, které byly popsány v úvodních dílech seriálu, kdy byly popisovány datové typy. Funkce pro práci s nimi jsou stejné jako pro práci se standardními řetězci, ale mají některé drobné odlišnosti ve vstupních datech a návratových hodnotách.
funkce | Návratový typ | popis | příklad |
---|---|---|---|
|| | bytea | spojení dvou řetězců | SELECT ('\\\\Post'::bytea || '\\047gres\\000'::bytea); |
octet_length(text) | integer | počet bytů v binárním řetězci | SELECT octet_length('cGFtcGVsablrYQ==') |
position(text in text2) | integer | Pozice řetězce text v text2 | SELECT POSITION('\\000be'::bytea in 'a\\000beceda'::bytea); |
substring(text [from integer][for integer2]) |
bytea | část řetězce text, je-li uveden parametr from, část začíná od toho znaku, není-li uvede, výběr jede od počátku, parametr for udává délku výběru, není-li uveden, bude do konce | SELECT SUBSTRING('Uče\\007bnice jazyka java'::bytea FROM 5); |
trim([both] vzorek from text) | bytea | odstranění nejdelších opakování vzorku z textu. Pracuje stejně jako stejnojmenná funkce pro klasické řetězce | SELECT TRIM('\\005'::bytea FROM '\\005\\005NVU user\\005'::bytea); |
get_byte(text, offset) | integer | Výběr znaku na pozici offset z textu | SELECT GET_BYTE('\\000Nějaký řetězec'::bytea, 5); |
set_byte(text, offset, znak) | bytea | Nastavení byte v řetězci | SELECT SET_BYTE('Fa\\009ntomas'::bytea,3,'_'); |
get_bit(text, offset) | integer | Hodnota bitu na pozici určené parametrem offset | SELECT GET_BIT('Žrádlo\\032pro kočky',57); |
set_bit(text, offset, hodnota) | bytea | Nastavení bitu v textu na pozici udané offsetem na hodnotu | SELECT SET_BIT('xxxu\\000',15,1); |
btrim(text1, text2) | bytea | Odstranění nejdelšího opakování vzorku text2 z řetězce text1 | SELECT BTRIM('\\008\\008Řetězec\\008'::bytea, '\\008'::bytea); |
length(text) | integer | Délka binárního řetězce | SELECT LENGTH('\\001Délka'::bytea); |
encode(text, typ) |
text | Zakódování binárního řetězce do ASCII reprezentace, podporované typy jsou: base64, hex, escape | SELECT ENCODE('\\005123\\000'::bytea, 'escape'); |
decode(text, typ) | bytea | Dekódování ASCII řetězce do binárního, typ je stejný jako v předchozím případě |
Funkce pro práce s řetězci pracují s typy char, character varying, char a text. Z výkonostních důvodů je vhodnější používat práci nad pevnou délkou řetězce, byť za cenu obětování prostorové kapacity disku na serveru.
Samozřejmostí je možnost používání více zpracovávajících funkcí v jednom dotazu (výběru) a tyto kombinovat případně i s funkcemi aritmetickými. Pravděpodobně nejpoužívanějšími funkcemi budou trimovací funkce a převod mezi kódováním. Výběr kódování může být řízen dynamicky z aplikace podle platformy klienta.
Tento díl byl druhý z těch, které jsou v podstatě jen výčtem funkcí s jejich velmi hrubým popisem. Z důležitých a používaných funkcí zbývají tři rodiny funkcí, pro práci s datumem/časem, se síťovými hodnotami a s geometrickými daty. Poté přijde něco malinko složitějšího.