PostgreSQL (9) – SELECT III
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ý | read 24021×
DISCUSSION
Práce s řetezci
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.
Závěr
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.
|
|
DISCUSSION
For this item is no comments.
|
Add comment is possible for logged registered users.
|
|
Search Software
Search Google
|