SQL eilutės funkcijos – naudojimo pavyzdžiai. Eilučių funkcijų derinimas su Transact-SQL SQL funkcijomis, siekiant sujungti eilutes

Šioje dalyje kalbėsime apie funkcijas, skirtas darbui su tekstine informacija, kurios gali būti naudojamos užklausose ir programos kode PL/SQL kalba.

Funkcija CONCAT(strl, str2)

Ši funkcija sujungia eilutes strl ir str2. Jei vienas iš argumentų yra NULL, tada jis laikomas tuščia eilute. Jei abu argumentai yra NULL, tada funkcija grąžina NULL. Pavyzdys:

SELECT CONCAT("Kunigas turėjo šunį") x1,
CONCATCTest" , NULL) x2,
CONCAT(NULL, "Test") x3,
CONCAT(NULL, NULL) x4
IŠ dvigubo

Kunigas turėjo šunį

Norėdami sujungti eilutes, „Oracle“ palaiko specialų sujungimo operatorių „||“, kuris veikia panašiai kaip CONCAT funkcija, pavyzdžiui:

SELECT CONCAT("Kunigas "turėjo šunį") x1, "Kunigas" || "turėjo šunį" x2
IŠ dvigubo

Nepainiokite sujungimo operatoriaus „||“, kuris atitinka CONCAT funkcijos iškvietimą, ir operatoriaus „+“, naudojamo atliekant aritmetines operacijas. „Oracle“ tai yra skirtingi operatoriai, tačiau dėl automatinio tipo liejimo galimos subtilios klaidos, pvz.:

PASIRINKITE „5“ + „3“ x1
IŠ dvigubo

Šiuo atveju grąžinama skaitinė reikšmė 8, o ne teksto eilutė "53". Taip yra todėl, kad kai „Oracle“ aptinka aritmetinį operatorių „+“, „Oracle“ automatiškai bando pateikti argumentus į NUMBER tipą.

Funkcija LOWER(str)

Funkcija LOWER paverčia visus str simbolius mažosiomis raidėmis. Pavyzdys:

SELECT LOWER("TEKSTO DUOMENYS") X
IŠ dvigubo

FunkcijaVIRŠUTINIS (str)

Funkcija UPPER konvertuoja visus eilutės str simbolius į didžiąsias raides. Pavyzdys:

PASIRINKITE VIRŠUTĮ ("TEKSTO DUOMENYS") X
IŠ dvigubo

INITCAP(str) funkcija

Grąžina eilutę str su pirmosiomis visų žodžių raidėmis, konvertuotomis į didžiąsias raides. Funkcija yra patogi norint suformatuoti visą pavadinimą kuriant ataskaitas. Pavyzdys:

PASIRINKITE INITCAPCIVANOVĄ Petrą Sidorovičių") X
IŠ dvigubo

FunkcijosLTRIM(str [,set])IrRTRIM(str [,set])

Funkcija LTRIM pašalina visus simbolius nuo eilutės pradžios iki pirmojo simbolio, kurio nėra nustatytame simbolių rinkinyje. Pagal numatytuosius nustatymus rinkinį sudaro vienas tarpas ir jis negali būti nurodytas. Funkcija RTRIM yra panaši į LTRIM, bet pašalina simbolius pradedant nuo eilutės pabaigos. Pažvelkime į kelis pavyzdžius:

PASIRINKITE LTRIM("TEXT DATA") X1,
LTRIM(" _ # TEXT DATA", " #_") X2,
LTRIM(" 1234567890 TEXT DATA", " 1234567890") X3
IŠ dvigubo

Funkcija REPLACE(st, search_str, [,replace_str])

Funkcija REPLACE ieško paieškos_str šablono eilutėje str ir kiekvieną rastą atvejį pakeičia pakeitimo_str. Pagal numatytuosius nustatymus pakeisti_str yra tuščia eilutė, todėl iškvietus REPLACE su dviem argumentais pašalinami visi rasti įvykiai. Ieškant poeilutės skiriamos didžiosios ir mažosios raidės. Pavyzdys:

SELECT REPLACE("Kunigas turėjo šunį", "šuo", "katė") x1,
REPLACE("Kunigas turėjo blogą šunį", "blogis") x2,
REPLACE("Kunigas turėjo šunį", "Šuo", "Katė") x3
IŠ dvigubo

Kunigas turėjo katę

Kunigas turėjo šunį

Kunigas turėjo šunį

Funkcija TRANSLATE(str, from_mask, to_mask)

Funkcija TRANSLATE analizuoja eilutę str ir visus simbolius, esančius eilutėje from_mask, pakeičia atitinkamais simboliais iš to_mask. Kad funkcija veiktų tinkamai, eilutės from_mask ir to_mask turi būti vienodo ilgio arba eilutė from_mask turi būti ilgesnė nei to_mask. Jei from_mask yra ilgesnis nei to_mask ir apdorojant eilutę str randami simboliai, atitinkantys vieną iš from_mask simbolių, o to_mask jiems nėra atitikimo, tokie simboliai bus pašalinti iš eilutės str. Jei perduodate from_mask arba to_mask lygų NULL, funkcija grąžins NULL. Palyginimui skiriamos didžiosios ir mažosios raidės.

SELECT TRANSLATE("Test 12345", "e2\"E!") x1,
TRANSLATE("Test 12345", "e234", "E") x2
IŠ dvigubo

Ši funkcija patogi sprendžiant daugybę praktinių problemų, susijusių su simbolių konvertavimu ar draudžiamų simbolių paieška. Pavyzdžiui, reikia išanalizuoti slaptažodį ir išsiaiškinti, ar jame yra bent vienas skaitmuo. Šio patikrinimo įgyvendinimas naudojant TRANSLATE atrodo taip:

IF TRANSLATE(PassWd, "0123456789", "*") = PassWd THEN
ADD_ERR0R("Klaida – slaptažodyje turi būti bent vienas skaitmuo!");
GRĄŽINTI 1;
ENDIF;

Kitas pavyzdys: skaičius ruošiamas konvertuoti į NUMBER. Būtina pakeisti dešimtainius skyriklius "," ir "." ant "." ir pašalinkite tarpus. Šios operacijos įgyvendinimas naudojant TRANSLATE atrodo taip:

SELECT TRANSLATE("123 455.23", "., ", " . . ") x1,
TRANSLATE("-123 455.23", "., ", " . . ") x2
IŠ dvigubo

Funkcija SUBSTR(str, m [,n])

Funkcija SUBSTR grąžina eilutės str fragmentą, prasidedantį simboliu m, kurio ilgis yra n simbolių. Ilgį galima praleisti – tokiu atveju eilutė grąžinama nuo simbolio m iki eilutės str pabaigos. Simboliai numeruojami pradedant nuo 1. Jei nurodote m = 0, kopijavimas vis tiek prasidės nuo pirmojo simbolio. Nurodžius neigiamą m reikšmę, simboliai skaičiuojami nuo eilutės pabaigos, o ne nuo pradžios. Nurodžius m reikšmes, kurių absoliuti reikšmė yra didesnė už eilutės ilgį, funkcija grąžina NULL.

SELECT SUBSTR("Kunigas turėjo šunį", 13) x1,
SUBSTR("Kunigas turėjo šunį", -6) x2,
SUBSTR("Tai bandomasis tekstas", 5, 8) x3,
SUBSTR("Kunigas turėjo šunį", 150) x4
IŠ dvigubo

tekstą

Funkcija INSTR(str, paieškos_str [,n[,m]])

Funkcija INSTR grąžina eilutės fragmento str pirmojo simbolio m-ro padėtį, atitinkančią paieškos_str. Lyginimas atliekamas iš n-ojo eilutės str simbolio; lyginant skiriamos didžiosios ir mažosios raidės. Pagal numatytuosius nustatymus n = m = 1, tai yra, paieška vykdoma nuo eilutės pradžios ir grąžinama pirmojo rasto fragmento padėtis. Jei paieška nepavyksta, funkcija grąžina 0.

SELECT INSTR("y užpakalis buvo šuo", "šuo") x1,
INSTR("y užpakalis buvo šuo", "katė") x2,
INSTR("Tai tekstas, skirtas pademonstruoti teksto paiešką", "tekstas", 1, 2) x3,
INSTR(‘11111000000001", "1", 7) x4
IŠ dvigubo

Naudojant šią funkciją, kaip ir visas kitas „Oracle“, dažnai daromos klaidos, susijusios su NULL reikšmių tvarkymu. Jei str = NULL, tada funkcija grąžins NULL, o ne nulį! Į tai reikia atsižvelgti kuriant įvairias sąlygas. Pavyzdžiui, šiame PL/SQL programos fragmente neatsižvelgiama į šią funkciją:

IF INSTR(TXT_VAR,"*") = 0 TADA
...
GALASJEI;

Šiuo atveju teisinga būtų rašyti taip:

JEI NVL(INSTR(TXT_VAR, "*"), 0) = 0 TAI
...
ENDIF;

LENGTH (str) ir LENGTHB (str) funkcijos

Funkcija LENGTH(str) grąžina eilutės str ilgį simboliais. Jei eilutė yra tuščia ir reikšmė NULL, funkcija grąžina NULL, todėl kartu su šia funkcija rekomenduojama naudoti NVL.

SELECT LENGTH("Kunigas turėjo šunį") x1,
LENGTH("") x2,
ILGIS (NULL) x3,
NVL(ILGIS(""), 0) x4
IŠ dvigubo

Funkcija LENGTHB yra panaši į LENGTH funkciją, bet grąžina eilutės ilgį baitais.

ASCII(str) funkcija

Grąžina pirmojo eilutės str simbolio ASCII reikšmę, kai naudojama ASCII simbolių koduotė, ir pirmojo kelių baitų simbolio baito reikšmę, kai naudojama kelių baitų simbolių koduotė. Pavyzdys:

PASIRINKITE ASCII("Test") x1 FROM dual

Funkcija CHR(n)

Grąžina simbolį pagal jo kodą.

PASIRINKITE CHR(64) x1
IŠ dvigubo

Čia yra visas eilučių funkcijų sąrašas, paimtas iš BOL:

ASCII NCHAR GARSAS
CHAR PATINDEX ERDVĖ
CHARINDEX PAKEISTI STR
SKIRTUMAS QUOTENAME DAIKTAI
KAIRĖ ATKARTOTI SUBSTRING
LEN ATvirkščiai UNIKODAS
AZEMESNIS TEISINGAI VIRŠUTINIS
LTRIM RTRIM

Pradėkime nuo dviejų tarpusavyje atvirkštinių funkcijų - ASCII Ir CHAR.

Funkcija ASCII grąžina eilutės išraiškos, kuri yra funkcijos argumentas, kairiojo krašto ASCII kodą.

Pavyzdžiui, štai kaip galite nustatyti, kiek yra skirtingų raidžių, pradedančių laivų pavadinimus lentelėje Laivai:


Reikėtų pažymėti, kad panašų rezultatą galima lengviau gauti naudojant kitą funkciją - KAIRĖ, kurios sintaksė yra tokia:

KAIRĖ (<styginių išraiška>, <sveikojo skaičiaus išraiška>)

ir nupjauna simbolių skaičių iš kairės, nurodytą antruoju argumentu, iš eilutės, kuri yra pirmasis argumentas. Taigi,

PASIRINKTI ATSKIRIMĄ KAIRĮ (vardas, 1) IŠ siuntimų UŽSAKYTI IKI 1

Štai kaip, pavyzdžiui, galite gauti visų abėcėlės simbolių kodų lentelę:

PASIRINKTI CHAR(ASCII("a")+ skaičius-1) raidė, ASCII("a")+ skaičius - 1
FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS nr
NUO (PASIRINKTI 1 a SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGĄ VISUS PASIRINKTI 3 SĄJUNGĄ VISUS PASIRINKTI 4 SĄJUNGĄ VISUS PASIRINKTI 5) x
KRYŽIAUS JUNGIMAS
(PASIRINKTI 1 b SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGOS VISKAS PASIRINKTI 5) y
KRYŽIAUS JUNGIMAS
(PASIRINKTI 1 c SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGOS VISKAS PASIRINKTI 5) z
) x
KUR ASCII("a")+ skaičius -1 TARP ASCII("a") IR ASCII("z")

Tiems, kurie dar nežino apie skaičių sekos generavimą, kreipiuosi į atitinkamą straipsnį.

Kaip žinote, mažųjų ir didžiųjų raidžių kodai skiriasi. Todėl norėdami gauti visą rinkinį neperrašydami užklausos, tereikia pridėti panašų į aukščiau pateiktą kodą:


Manau, kad prireikus šią raidę pridėti prie lentelės nebus sunku.

Dabar panagrinėkime užduotį, kaip nustatyti, kur eilutės išraiškoje rasti norimą poeilelę. Tam gali būti naudojamos dvi funkcijos - CHARINDEX Ir PATINDEX. Jie abu grąžina eilutės poeilės pradinę padėtį (eilutės pirmojo simbolio vietą). Funkcija CHARINDEX turi tokią sintaksę:

CHARINDEX( paieškos_išraiška, eilutės_išraiška[, pradžios_pozicija])

Čia yra pasirenkamas sveikojo skaičiaus parametras pradžios_pozicija apibrėžia vietą eilutės išraiškoje, iš kurios atliekama paieška paieškos_išraiška. Jei šis parametras praleistas, paieška atliekama nuo pradžių eilutės_išraiška. Pavyzdžiui, prašyti

Reikėtų pažymėti, kad jei ieškoma poeilutė ar eilutės išraiška yra NULL, tai funkcijos rezultatas taip pat bus NULL.

Toliau pateiktame pavyzdyje nustatomos pirmojo ir antrojo simbolio „a“ pasireiškimo vietos laivo pavadinime „Kalifornija“.

SELECT CHARINDEX("a",vardas) pirmas_a,
CHARINDEX("a", pavadinimas, CHARINDEX("a", vardas)+1) antra_a
FROM Ships WHERE name = "Kalifornija"

Atkreipkite dėmesį, kad apibrėžiant antrąjį funkcijos simbolį, naudojama pradinė padėtis, kuri yra simbolio, einančio po pirmosios raidės "a" - CHARINDEX("a", pavadinimas)+1 padėtis. Rezultato teisingumą – 2 ir 10 – nesunku patikrinti :-).

Funkcija PATINDEX turi tokią sintaksę:

PATINDEX("% mėginys%" , eilutės_išraiška)

Pagrindinis skirtumas tarp šios funkcijos ir CHARINDEX yra tas paieškos eilutė gali būti pakaitos simbolių - % ir _. Šiuo atveju reikia įrašyti galinius simbolius „%“. Pavyzdžiui, šios funkcijos naudojimas pirmame pavyzdyje atrodytų taip


Šios užklausos rezultatas atrodo taip:


Tai, kad gauname tuščią rezultatų rinkinį, reiškia, kad duomenų bazėje tokių laivų nėra. Paimkime vertybių derinį - laivo klasę ir pavadinimą.

Dviejų eilutės reikšmių sujungimas į vieną vadinamas sujungimas, ir į SQL serveris šiai operacijai naudojamas „+“ ženklas (standartiniame „||“). Taigi,

Ką daryti, jei eilutės išraiškoje yra tik viena raidė? Užklausa tai iškels. Tai galite lengvai patikrinti rašydami


Žemiau yra visas eilučių funkcijų, paimtų iš BOL, sąrašas:

ASCII NCHAR GARSAS
CHAR PATINDEX ERDVĖ
CHARINDEX PAKEISTI STR
SKIRTUMAS QUOTENAME DAIKTAI
KAIRĖ ATKARTOTI SUBSTRING
LEN ATvirkščiai UNIKODAS
AZEMESNIS TEISINGAI VIRŠUTINIS
RTRIM RTRIM

Pradėkime nuo dviejų tarpusavyje susijusių funkcijų – ASCII ir CHAR:

Funkcija ASCII grąžina ASCII kodo reikšmę kairėje pusėje esančiam simbolio išraiškos simboliui, kuris yra funkcijos argumentas.

Štai pavyzdys, kaip nustatyti, nuo kiek skirtingų raidžių prasideda laivų pavadinimai lentelėje Laivai:

PASIRINKTI SKAIČIUS (ATSKIRTI ASCII (vardas)) IŠ laivų

Rezultatas yra 11. Norėdami sužinoti, kas yra šios raidės, galime naudoti funkciją CHAR, kuri grąžina simbolį pagal žinomą ASCII kodo reikšmę (nuo 0 iki 255):

PASIRINKITE ATSKIRIMĄ CHAR(ASCII(vardas)) IŠ siuntimų UŽSAKYTI IKI 1

Reikėtų pažymėti, kad identiškas rezultatas gali būti paprastesnis naudojant dar vieną funkciją - KAIRĖ kuri turi tokią sintaksę:

KAIRĖ (<charakterio_raiška>, <sveikasis_išraiška>)

ir grąžina simbolių eilutės dalį, prasidedančią nuo nurodyto simbolių skaičiaus iš kairės. Taigi,

PASIRINKTI ATSKIRIMĄ KAIRĮ (vardas, 1) IŠ siuntimų UŽSAKYTI IKI 1

Ir taip galite gauti visų abėcėlės simbolių kodų lentelę:

PASIRINKTI CHAR(ASCII("a")+ skaičius-1) raidė, ASCII("a")+ skaičius - 1 NUO

(PASIRINKTI 1 a SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGĄ VISUS PASIRINKTI 5) x
KRYŽIAUS PRIJUNGIMO
KRYŽIAUS PRIJUNGIMO
) x
KUR ASCII("a")+ skaičius -1 TARP ASCII("a") IR ASCII("z")

Tiems, kurie nežino apie skaitinės sekos generavimą, kreipiuosi į atitinkamą straipsnį.

Yra žinoma, kad mažųjų ir didžiųjų raidžių kodų reikšmės skiriasi. Štai kodėl norint gauti visą rinkinį neperrašant aukščiau pateiktos užklausos, pakaks įrašyti identišką kodą aukščiau nurodytam:

SĄJUNGOS
PASIRINKTI CHAR(ASCII("A")+ skaičius-1) raidė, ASCII("A")+ skaičius - 1
NUO
PASIRINKITE 5*5*(a-1)+5*(b-1) + c AS skaičius NUO
(PASIRINKTI 1 a SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGOS VISKAS PASIRINKTI 5) x
KRYŽIAUS PRIJUNGIMO
(PASIRINKTI 1 b SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGOS VISKAS PASIRINKTI 5) y
KRYŽIAUS PRIJUNGIMO
(PASIRINKTI 1 c SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGOS VISKAS PASIRINKTI 5) z
) x
KUR ASCII("A")+ skaičius -1 TARP ASCII("A") IR ASCII("Z")

Dabar apsvarstykime užduotį ieškoti poeilutės eilutės išraiškoje. Tam gali būti naudojamos dvi funkcijos: CHARINDEX ir PATINDEX. Jie abu grąžina pradinę padėtį (pirmojo poeilės simbolio vietą) simbolių eilutėje. Funkcija CHARINDEX turi tokią sintaksę:

CHARINDEX( eilutės_išraiška , tikslo_išraiška [ , pradžios_vieta ])

Čia pasirenkamas sveikojo skaičiaus parametras pradžios_vieta apibrėžia padėtį a eilutės_išraiška, kur ieškoma a tikslinės_išraiškos prasideda nuo. Jei šis argumentas praleistas, paieška pradedama nuo a pradžios eilutės_išraiška. Pavyzdžiui, užklausa

PASIRINKITE pavadinimą FROM Ships WHERE CHARINDEX("sh", pavadinimas) > 0

išves, kad laivų pavadinimuose yra simbolių seka "sh". Čia mes naudojame faktą, kad jei reikia rasti poeilutės nerastas, funkcija CHARINDEX grąžina 0. Užklausos vykdymo rezultate bus šie laivai:

vardas
Kirishima
Musashi
Vašingtonas

Reikėtų pažymėti, kad jei a tikslinės_išraiškos arba eilutės_išraiška yra NULL, funkcijos rezultatas taip pat yra NULL.

Kitas pavyzdys nustato pirmojo ir antrojo simbolio „a“ pasikartojimo vietas laivo „California“ pavadinime.

SELECT CHARINDEX("a",vardas) pirmas_a,
CHARINDEX("a", pavadinimas, CHARINDEX("a", vardas)+1) antra_a

Atkreipkite dėmesį, kad nustatant antrąjį įvykį pradinė padėtis, naudojama funkcijoje, yra simbolio padėtis šalia pirmojo "a" - CHARINDEX("a", pavadinimas)+1. Rezultato – 2 ir 10 – tinkamumą galima nesunkiai patikrinti.

Funkcija PATINDEX turi tokią sintaksę:

PATINDEX ( "%pattern%" , string_expression)

Pagrindinis šios funkcijos skirtumas nuo CHARINDEX yra tas, kad paieškos eilutėje gali būti pakaitos simbolių – % ir _. Privalomi pirmieji ir pabaigos ženklai „%“. Pavyzdžiui, šios funkcijos naudojimas pirmame pavyzdyje atrodys taip

PASIRINKITE pavadinimą FROM Siunčiame WHERE PATINDEX("%sh%", pavadinimas) > 0

Ir yra būdas rasti laivų pavadinimus, kuriuose yra trijų simbolių seka, iš kurių pirmasis ir paskutinis yra „e“:

PASIRINKITE pavadinimą FROM Ships
WHERE PATINDEX("%e_e%", pavadinimas) >0

Šios užklausos vykdymo rezultatas atrodo taip:

vardas
Kerštas
Karališkasis Valdovas

Funkcija TEISINGAI kad papildo KAIRĖ grąžina nurodytą simbolių skaičių iš simbolio išraiškos dešinės:

RIGHT(<charakterio_raiška>,<sveikasis_išraiška>)

Pavyzdžiui, čia yra būdas nustatyti laivų pavadinimus, kurie prasideda ir baigiasi ta pačia raide:

PASIRINKITE pavadinimą FROM Ships
WHERE LEFT(vardas, 1) = DEŠINĖ(vardas, 1)

Tai, kad gavome tuščią gautą rinkinį, reiškia, kad tokių laivų mūsų duomenų bazėje nėra. Paimkime derinį – klasė ir laivo pavadinimas.

Vadinamas dviejų eilučių reikšmių sujungimas į vieną sujungimas, ir SQL serverisšiai operacijai naudojamas ženklas „+“ (standartiškai „||“). Taigi,

PASIRINKTI * NUO (
) x

Čia tarpais atskiriame klasę ir laivo pavadinimą. Be to, kad nekartotų visos konstrukcijos argumente funkcijos, naudojame antrinę užklausą. Rezultatas atrodys taip:

cn
Ajova, Misūris
Šiaurės Karolina, Vašingtonas

O kas, jei eilutės išraiškoje bus tik vienas simbolis? Užklausa ją išves. Galite lengvai tai patikrinti parašę

PASIRINKTI * NUO (
PASIRINKITE klasę +" "+ pavadinimas AS cn IŠ Laivų
UNION ALL PASIRINKITE "a" kaip nc
) x
WHERE LEFT(cn, 1) = RIGHT(cn, 1)

Kad būtų išvengta šio atvejo, dar viena naudinga funkcija LEN( eilutės_išraiška) Gali būti naudojamas. Jis grąžina simbolių skaičių eilutėje. Apsiribokime tuo atveju, kai simbolių skaičius didesnis nei vienas:

PASIRINKTI * NUO (
PASIRINKITE klasę +" "+ pavadinimas AS cn IŠ Laivų
UNION ALL PASIRINKITE "a" kaip nc
) x
WHERE LEFT(cn, 1) = RIGHT(cn, 1) AND LEN(cn)>1

Svetainėje yra užduočių, kurioms reikia normalizuoti (rasti maksimalų ir pan.) skaitine tvarka eilučių formatu pavaizduotas reikšmes, pavyzdžiui, sėdynės numeris plokštumoje („2d“) arba CD greitis ( „24x“). Problema slypi tame, kad tekstas rūšiuojamas taip (didėjimo tvarka)

11a
1a
2a

PASIRINKITE "1a" AS vietą
UNION ALL SELECT "2a"
UNION ALL SELECT "11a"
UŽSAKYTI IKI 1

Jei reikia rūšiuoti vietas eilučių didėjimo tvarka, tvarka turi būti tokia:

1a
2a
11a

Norint gauti tokią tvarką, tekste reikia rūšiuoti pagal skaitines reikšmes. Siūlau tokį algoritmą:
1. Ištraukite skaičių iš eilutės.
2. Konvertuokite jį į skaitmeninį formatą.
3. Atlikite rūšiavimą pagal konvertuotą reikšmę.

Kadangi žinome, kad eilutėje yra tik viena raidė, ir norėdami išgauti skaičių, galime naudoti tokią konstrukciją, kuri nepriklauso nuo skaitmenų skaičiaus sėdynės numeryje:

KAIRĖ(vieta, LEN(vieta)-1)

Jei tik to prisirišime, mes pasieksime

vieta
1a
11a
2a

Konvertavimas į skaitmeninį formatą gali atrodyti taip:

CAST (LEFT(vieta, LEN(vieta)-1) AS INT)

Dabar turėtume atlikti rūšiavimą

PASIRINKTI * NUO (
PASIRINKITE "1a" AS vietą
UNION ALL SELECT "2a"
UNION ALL SELECT "11a"
) x UŽSAKYTI PAGAL AKTIMĄ (KAIRĖ(vieta, LEN(vieta)-1) AS INT)

Kaip reikalaujama įrodyti.

Anksčiau naudojome funkciją LEFT norėdami išgauti skaičių iš eilutės išraiškos, nes a priori žinojome, kiek simbolių reikia pašalinti iš dešinės (vieno). O kas, jei eilutę iš poeilutės išskirtume ne pagal žinomą simbolio padėtį, o pagal patį simbolį? Pavyzdžiui, išskleiskite visus simbolius prieš pirmąją raidę "x" (CD greičio reikšmė).

Anksčiau šiuo atveju taip pat galime naudoti nagrinėjamą CHARINDEX funkciją, kuri leidžia mums nustatyti nežinomą simbolio vietą:

PASIRINKITE modelį, LEFT(cd, CHARINDEX("x", cd) -1) IŠ PC

SUBSTRING funkcija

SUBSTRING (<išraiška> ,<pradėti>,<ilgio>)

Ši funkcija leidžia iš išraiškos išgauti jos nurodyto ilgio dalį, pradedant nuo nurodytos pradinės padėties. Išraiška gali būti simbolis arba dvejetainė eilutė, taip pat gali turėti teksto arba vaizdo tipą. Pavyzdžiui, jei mums reikia gauti 3 simbolius laivo pavadinime, pradedant nuo 2-ojo simbolio, tai padaryti be SUBSTRING funkcijos nėra gana lengva. Taigi mes rašome:

PASIRINKITE pavadinimą, SUBSTRING(vardas, 2, 3) IŠ laivų

Jei mums reikia išgauti visus simbolius, pradedant nuo tam tikrų, taip pat galime naudoti šią funkciją. Pavyzdžiui,

PASIRINKITE pavadinimą, SUBSTRING(vardas, 2, LEN(vardas)) IŠ laivų

duos mums visus laivų pavadinimų simbolius, pradedant nuo antros pavadinimo raidės. Atkreipkite dėmesį, kad norėdamas nurodyti išgautinų simbolių skaičių, naudojau funkciją LEN(vardas), kuri pavadinime grąžina keletą simbolių. Aišku, kad tiek, kiek man reikia simbolių, pradedant nuo antrojo, jo skaičius bus mažesnis nei visas vardo simbolių skaičius. Tačiau tai nesukelia klaidos, nes jei nurodytas simbolių skaičius viršija leistinas skaičius, visi simboliai iki eilutės pabaigos bus išgauti. Štai kodėl aš į tai žiūriu su atsarga, negailėdamas savęs skaičiavimams.

ATvirkščiai funkcija

Ši funkcija apverčia eilutę, kaip ir skaitydama ją iš dešinės į kairę. Tai yra užklausos rezultatas

SELECT REVERSE("abcdef")

bus "fedcba". Jei kalboje nėra funkcijos RIGHT, užklausa

PASIRINKTI TEISINĘ("abcdef",3)

taip pat gali būti pakeistas užklausa

PASIRINKTI ATGIRTINĘ(KAIRĖ(REVERSE("abcdef"),3))

Šios funkcijos pelną matau toliau. Turime nustatyti ne pirmą, o paskutinį bet kurio simbolio (arba simbolių sekos) vietą simbolių eilutėje.

Priminsime pavyzdį, kai laivo „California“ pavadinime nustatėme pirmojo simbolio „a“ vietą:

PASIRINKITE CHARINDEX("a", vardas) pirmas_a
FROM Ships WHERE name = "Kalifornija"

Dabar nustatykime, kur yra paskutinis simbolis „a“ šiame pavadinime. Funkcija

CHARINDEX("a", ATvirkščiai(vardas))

leis mums rasti šią poziciją, bet iš dešinės. Norint gauti šio veikėjo poziciją, bet iš kairės, užtenka parašyti

SELECT LEN(vardas) + 1 - CHARINDEX("a", REVERSE(vardas)) first_a
FROM Ships WHERE name = "Kalifornija"

PAKEISTI funkcija

PAKEISTI (<eilutės_išraiška1> , <eilutės_išraiška2> , <eilutės_išraiška3>)

Ši funkcija pakeičia eilutės_išraiška1 visi įvykiai eilutės_išraiška2 su eilutės_išraiška3. Ši funkcija yra labai naudinga ATNAUJINTI operatoriai, jei turėtume pakeisti stulpelio turinį. Pavyzdžiui, laivų pavadinimuose reikia pakeisti visus tarpus brūkšneliu. Tada galėsime rašyti

ATNAUJINIMAS Laivams
NUSTATYTI pavadinimą = PAKEISTI(vardas, " ", "-")

(Šį pavyzdį galite atlikti puslapyje su DML pratimais, kur leidžiami klausimai apie duomenų atnaujinimą)

Tačiau ši funkcija taip pat gali rasti savo prietaisą nereikšmingesniais atvejais. Nustatykime, kiek kartų laivo pavadinime naudojama raidė "a". Idėja gana paprasta: kiekvieną ieškomą raidę pakeisime bet kokiais dviem simboliais, o po to apskaičiuosime ilgių skirtumą gautos eilutės ir šaltinio eilutės. Taigi,

PASIRINKITE pavadinimą, LEN(REPLACE(pavadinimas, "a", "aa")) - LEN(vardas) FROM Ships

O kas, jei reikia nustatyti atsitiktinės simbolių sekos, kurią, tarkime, gauname kaip saugomos procedūros parametrą, skaičių? Šiuo atveju turėtume papildyti aukščiau pateiktą algoritmą padalijimu į keletą simbolių iš eilės:

DEKLARUOTI @str AS VARCHAR(100)
NUSTATYTI @str="ma"
PASIRINKITE pavadinimą, (LEN(REPLACE(vardas, @str, @str+@str)) - LEN(vardas))/LEN(@str) FROM siuntų

Čia, siekiant padvigubinti ieškomų simbolių skaičių, buvo pritaikyta jungtis @str+@str. Tačiau šiam efektui galime naudoti dar vieną funkciją - ATKARTOTI kuris pakartoja pirmąjį argumentą tiek kartų, kiek nurodė antrasis argumentas.

PASIRINKTI pavadinimą, (LEN(REPLACE(vardas, @str, REPLICATE(@str, 2))) - LEN(vardas))/LEN(@str) FROM Ships

Tai reiškia, kad pakartojame du kartus poeilelę, saugomą kintamajame @str.

Jei eilutėje reikia pakeisti ne tam tikrą simbolių seką, o nurodytą skaičių simbolių, pradedant nuo kokios nors padėties, paprasčiau naudoti DAIKTAI funkcija:

Daiktai (<simbolio_raiška1> , <pradėti> , , <charakterio_išraiška2>)

Ši funkcija pakeičia eilutę ilgiu ilgio kuri prasideda nuo pradėti poziciją simbolio_raiška1 su charakterio_išraiška2.

Pavyzdys. Pakeiskite laivo pavadinimą: po pirmųjų 5 simbolių pridėkite „_“ (pabraukimas) ir paleidimo metus. Jei pavadinime yra mažiau nei 5 simboliai, papildykite jį tarpais.

Šią užduotį galima išspręsti naudojant daugybę skirtingų funkcijų. Bandysime tai padaryti su DAIKTAI funkcija.

Pirmuoju metodu parašysime (susiribodami su pasirinkimo užklausa):

PASIRINKITE pavadinimą, STUFF(vardas, 6, LEN(vardas), "_"+paleista) IŠ laivų

LEN(vardas) naudoju kaip trečią argumentą (pakeičiamų simbolių skaičius), nes turėčiau pakeisti visus simbolius iki eilutės pabaigos, todėl aš jį imu su rezervu – pradinis simbolių skaičius pavadinimas. Bet ši užklausa vis tiek grąžins klaidą. Ir klausimas yra ne trečiame argumente, o ketvirtame, kur vyksta eilutės konstantos ir sveikojo skaičiaus stulpelio sujungimas. Tai tipo konvertavimo klaida. Norėdami konvertuoti skaičių į jo eilutės atvaizdavimą, galime naudoti dar vieną integruotą funkciją - STR:

STR (<float_expression> [ , <ilgio> [ , <dešimtainis> ] ])

Pagal šią konversiją yra apvalinamas ir a ilgio nurodo gautos eilutės ilgį. Pavyzdžiui,

STR(3.3456; 5; 1) 3.3
STR(3.3456; 5; 2) 3.35
STR(3.3456; 5; 3) 3.346
STR(3.3456; 5; 4) 3.346

Atkreipkite dėmesį, kad jei gautas eilutės vaizdas yra mažesnis už nurodytą ilgį, pridedami tarpai priekyje. Jei rezultatas yra didesnis už nurodytą ilgį, trupmeninė dalis trumpinama (su apvalinimu); jei yra sveikasis skaičius, gauname atitinkamą žvaigždučių skaičių „*“.

STR(12345;4;0) ****

Beje, numatytasis ilgis yra 10 simbolių. Turėdami omenyje, kad metai žymimi keturiais skaičiais, rašysime

PASIRINKITE pavadinimą, STUFF(vardas, 6, LEN(vardas), "_"+STR(paleistas, 4)) IŠ laivų

Viskas beveik teisinga. Atvejis apsvarstytas, kai simbolių skaičius pavadinime yra mažesnis nei 6, nes šiuo atveju funkcija STUFF suteikia NULL. Na, mes turėsime būti ant stovo iki galo, o tai susiję su šios funkcijos naudojimu šiame pavyzdyje, pakeliui taikant dar vieną eilutės funkciją.

Pridėsime paskutinius tuščius vardo ilgio laukus, kurie sąmoningai yra didesni nei 6. Yra specialus ERDVĖ funkcija tam

SPACE(<blankų_skaičius>):

PASIRINKITE pavadinimą, STUFF(vardas + TARPAS(6), 6, LEN(pavadinimas), "_"+STR(paleista,4)) IŠ laivų

LTRIM ir RTRIM funkcijas

LTRIM(<charakterio_raiška>)

RTRIM(<charakterio_raiška>)

atitinkamai supjaustykite eilutės išraiškos, kuri pagal numatytuosius nustatymus konvertuojama į VARCHAR tipo.

Turime sukurti tokią eilutę: keleivio vardas_keleivio identifikatorius už kiekvieną įrašą iš keleivių lentelės. Jei rašysime

PASIRINKITE pavadinimą + "_" + CAST(id_psg AS VARCHAR) IŠ keleivio,

rezultate gausime kažką panašaus į:

Tai susiję su tuo, kad stulpelio pavadinimas turi tipą CHAR(trisdešimt). Trumpoji eilutė pridedama su šiam tipui skirtais tuščiais laukeliais prie nurodyto matmens (turime 30 simbolių). Funkcija RTRIM mums padės čia:

SELECT RTRIM(vardas) + "_" + CAST(id_psg AS VARCHAR) IŠ keleivio

AZEMESNIS ir VIRŠUTINIS funkcijas

LOWER(<charakterio_raiška>)

UPPER(<charakterio_raiška>)

atitinkamai konvertuoti visus argumento simbolius į apatinį ir viršutinį registrą. Šios funkcijos yra naudingos, palyginti su nuo registro priklausomomis eilutėmis.

Pora įdomių funkcijų GARSAS ir SKIRTUMAS

SOUNDEX(<charakterio_raiška>)

SKIRTUMAS (<simbolio_raiška_1>, <simbolio_raiška_2>)

leidžia mums nustatyti panašiai skambantį žodžių. SOUNDEX grąžina keturių simbolių kodą, kad įvertintų panašumą, tačiau DIFFERENCE tiesiog tinkamai įvertina dviejų lyginamųjų simbolių eilučių panašumą. Kadangi šios funkcijos nepalaiko kirilicos, tai mane domina BOL jos naudojimo pavyzdžiams.

Pabaigoje pateiksime kai kurias funkcijas ir kelis Unicode naudojimo pavyzdžius:

UNIKODAS funkcija

UNICODE (<ncharacter_expression>)

grąžina Unicode reikšmę pirmajam įvesties išraiškos simboliui.

NCHAR funkcija

NCHAR (<sveikasis skaičius>)

grąžina simbolį su duota sveikojo skaičiaus Unikodo reikšme. Keli pavyzdžiai:

PASIRINKITE ASCII("a"), UNICODE("a")

Grąžina ASCII kodo reikšmę ir rusiškos raidės "a" Unicode reikšmę: 224 ir 1072.

PASIRINKITE CHAR(ASCII("a")), CHAR(UNIKODĄ("a"))

Bandome atkurti simbolį pagal jo kodo reikšmę. Mes gauname "a" ir NULL. Grąžinama NULL reikšmė, nes įprastoje kodų lentelėje nėra 1072 kodo reikšmės.

PASIRINKITE CHAR(ASCII("a")), NCHAR(UNIKODĄ("a"))

Dabar viskas gerai, "a" abiem atvejais.

PASIRINKTI NCHAR(ASCII("а"))

duos „a“, nes Unikodo reikšmė 224 tiksliai atitinka šią raidę.

» Pateiktus pavyzdžius galima atlikti tiesiogiai svetainėje, pažymėjus žymimąjį langelį „Be tikrinimo“ puslapyje su SELECT pratimais .

Pagrindinės eilučių funkcijos ir operatoriai suteikia įvairių galimybių ir dėl to grąžina eilutės reikšmę. Kai kurios eilučių funkcijos yra dviejų elementų, tai reiškia, kad jos vienu metu gali veikti dviejose eilutėse. SQL 2003 standartas palaiko eilučių funkcijas.

Sujungimo operatorius

SQL 2003 apibrėžia sujungimo operatorių (||), kuris sujungia dvi atskiras eilutes į vieną eilutės reikšmę.

DB2 platforma

DB2 platforma palaiko SQL 2003 sujungimo operatorių ir jo sinonimą – funkciją CONCAT.

MySQL platforma

MySQL platforma palaiko CONCATQ funkciją, SQL 2003 sujungimo operatoriaus sinonimą.

Oracle ir PostgreSQL

PostgreSQL ir Oracle platformos palaiko SQL 2003 dvigubos vertikalios juostos sujungimo operatorių.

SQL serverio platforma

SQL Server platforma naudoja pliuso ženklą (+) kaip SQL 2003 sujungimo operatoriaus sinonimą. SQL Server turi sistemos parametrą CONCAT_NULL_YIELDS_NULL, kuris valdo, kaip sistema elgiasi, jei jungiant eilutės reikšmes aptinkamos NULL reikšmės.

/* SQL 2003 sintaksė */

stringl || eilutė2 || styga3

eilutė1 eilutė2 eilutė3

/* MySQL */

CONCAT("stringl", "string2")

Jei kuri nors iš sujungtų reikšmių yra tuščia, grąžinama tuščia eilutė. Be to, jei sujungime yra skaitinė reikšmė, ji netiesiogiai konvertuojama į eilutės reikšmę.

SELECT CONCAT("Mano ", "bolonija", "turi", "a", "pirmas", "vardas...");

Mano Bolonija turi vardą

SELECT CONCAT("Mano ", NULL, "turi", "pirmasis", "vardas...");

KONVERTUOTI ir VERSTI

Funkcija CONVERT pakeičia simbolių eilutės rodymą simbolių rinkinyje ir palyginimą. Pavyzdžiui, funkcija CONVERT gali būti naudojama norint pakeisti simbolio bitų skaičių.

Funkcija TRANSLATE paverčia eilutės reikšmę iš vieno simbolių rinkinio į kitą. Pavyzdžiui, funkcija TRANSLATE gali būti naudojama norint konvertuoti reikšmę iš anglų kalbos simbolių rinkinio į Kanji (japonų) arba kirilicos (rusų) simbolių rinkinį. Pats vertimas jau turi egzistuoti – nurodytas pagal numatytuosius nustatymus arba sukurtas naudojant komandą CREATE TRANSLATION.

SQL 2003 sintaksė

CONVERT (simbolio_vertė NAUDOJANT simbolio_konversijos_pavadinimą)

TRANSLATE(simbolio_vertė NAUDOJANT vertimo_vardas)

Funkcija CONVERT konvertuoja simbolių reikšmę į simbolių rinkinį, kurio pavadinimas nurodytas parametre character_conversion_name. Funkcija TRANSLATE paverčia simbolių reikšmę į simbolių rinkinį, nurodytą vertimo_pavadinime.

Iš apžvelgtų platformų tik Oracle palaiko CONVERT ir TRANSLATE funkcijas, kaip apibrėžta SQL 2003 standarte. Oracle įdiegta funkcija TRANSLATE yra labai panaši į SQL 2003, bet nėra identiška. Šiame įgyvendinime funkcija naudoja tik du argumentus ir verčia tik tarp duomenų bazės simbolių rinkinio ir simbolių rinkinio, kuriame įgalinta lokalė.

„MySQL“ įdiegta CONV funkcija tik konvertuoja skaičius iš vienos bazės į kitą. SQL Server įdiegta funkcija CONVERT yra gana turtinga galimybių ir keičia išraiškos duomenų tipą, tačiau visais kitais aspektais skiriasi nuo SQL 2003 standarto funkcijos CONVERT. PostgreSQL platforma nepalaiko CONVERT funkcijos, o funkcijos TRANSLATE įgyvendinimas konvertuoja visus simbolių eilutės atvejus į bet kurią kitą simbolių eilutę.

DB2

DB2 platforma nepalaiko funkcijos CONVERT, o funkcijos TRANSLATE palaikymas nesuderinamas su ANSI. Funkcija TRANSLATE naudojama poeilėms transformuoti ir istoriškai buvo funkcijos UPPER sinonimas, nes funkcija UPPER buvo tik neseniai įtraukta į DB2. Jei funkcija TRANSLATE naudojama DB2 su vienu argumentu kaip simbolio išraiška, rezultatas yra ta pati eilutė, paversta didžiosiomis raidėmis. Jei funkcija naudojama su keliais argumentais, pvz., TRANSLATE(ucmo4HUK, pakeisti, atitikti), tada funkcija konvertuoja visus šaltinio simbolius, kurie taip pat yra atitikties parametre. Kiekvienas šaltinio simbolis, esantis toje pačioje pozicijoje kaip ir atitikties parametre, bus pakeistas simboliu iš pakeitimo parametro. Žemiau yra pavyzdys.

TRANSLATE("Sveikas, pasauli!") "HELLO; WORLD!"

TRANSLATE("Sveikas, pasaulis1", "wZ", "1W") "Hewwo, Zorwd1

MySQL

MySQL platforma nepalaiko TRANSLATE ir CONVERT funkcijų.

Orakulas

„Oracle“ platforma palaiko šią funkcijų CONVERT ir TRANSLATE sintaksę.

„Oracle“ diegime funkcija CONVERT grąžina simbolio reikšmės tekstą, konvertuotą į target_charset_set. Parametras char_value yra konvertuojama eilutė, target_charset_set yra simbolių rinkinio, į kurį turi būti konvertuojama eilutė, pavadinimas, o parametras source_charset yra simbolių rinkinys, kuriame iš pradžių buvo išsaugota eilutės reikšmė.

„Oracle“ funkcija TRANSLATE atitinka ANSI sintaksę, tačiau galite pasirinkti tik vieną iš dviejų simbolių rinkinių: duomenų bazės simbolių rinkinį (CHARJCS) ir nacionalinei kalbai būdingą simbolių rinkinį (NCHARJZS).

„Oracle“ taip pat palaiko kitą funkciją, dar vadinamą TRANSLATE (nenaudojant raktažodį NAUDOJIMAS). Ši funkcija TRANSLATE neturi nieko bendra su simbolių rinkinio konvertavimu.

Tikslinio ir šaltinio simbolių rinkinių pavadinimai gali būti perduodami kaip eilutės konstantos arba kaip nuoroda į lentelės stulpelį. Atminkite, kad konvertuodami eilutę į simbolių rinkinį, kuriame nerodomi visi konvertuojami simboliai, galite pakeisti pakaitinius simbolius.

„Oracle“ palaiko keletą bendrų simbolių rinkinių, įskaitant US7ASCII ir WE8DECDEC. WE8HP, F7DEC, WE8EBCDIC500, WE8PC850u WE8ISO8859PI. Pavyzdžiui:

SELECT CONVERT("Gro2", "US7ASCII", "WE8HP") FROM DUAL;

PostgreSQL

PostgreSQL platforma palaiko ANSI standartinį CONVERT teiginį, o konversijas čia galima apibrėžti naudojant komandą CREATE CONVERSION. PostgreSQL įdiegta funkcija TRANSLATE suteikia išplėstą funkcijų rinkinį, leidžiantį bet kokį tekstą konvertuoti į kitą tekstą nurodytoje eilutėje.

VERSTI (simbolių eilutė, iš_teksto, į_tekstą)

Štai keletas pavyzdžių:

SELECT TRANSLATE("12345abcde", "5a", "XX"); "1234XXbcde" SELECT TRANSLATE(title, "Computer", "PC") FROM titles WHERE type="Personal_computer" SELECT CONVERT("PostgreSQL" USING iso_8859_1_to_utf_8) "PostgreSQL"

SQL serveris

SQL serverio platforma nepalaiko funkcijos TRANSLATE. Funkcijos CONVERT įgyvendinimas sistemoje SQL Server neatitinka SQL standarto 2003. Ši funkcija SQL Server yra lygiavertė funkcijai CAST.

CONVERT (duomenų_tipas [(ilgis) | (tikslumas, mastelis)], išraiška, stilius])

Stiliaus sąlyga naudojama datos konvertavimo formatui apibrėžti. Už nugaros Papildoma informacijažr. SQL serverio dokumentaciją. Žemiau yra pavyzdys.

PASIRINKTI pavadinimą, CONVERT(char(7), ytd_pardavimas) IŠ pavadinimų ORDER BY title GO

Čia yra visas eilučių funkcijų sąrašas, paimtas iš BOL:

Rezultatas yra 11. Norėdami sužinoti, kokios tai raidės, galime naudoti funkciją CHAR, kuri grąžina simbolį žinomu ASCII kodu (nuo 0 iki 255):

Štai kaip, pavyzdžiui, galite gauti visų abėcėlės simbolių kodų lentelę:

SELECT CHAR(ASCII("a")+ skaičius-1) raidė, ASCII("a")+ skaičius - 1 FROM (SELECT 5*5*(a-1)+5*(b-1) + c AS skaičius FROM (PASIRINKTI 1 a SĄJUNGOS VISUS PASIRINKTI 2 SĄJUNGĄ VISUS PASIRINKTI 3 SĄJUNGĄ VISUS PASIRINKTI 4 SĄJUNGĄ VISUS PASIRINKTI 5) x KRYŽIAUS PRISIJUNGTI (PASIRINKTI 1 b SĄJUNGOS VISUS PASIRINKTI 2 SĄJUNGĄ VISUS PASIRINKTI 3 SĄJUNGĄ VISUS PASIRINKTI 4 SĄJUNGĄ VISUS PASIRINKTI 5) y CROSS JOIN ( PASIRINKTI 1 c SĄJUNGOS VISKAS PASIRINKTI 2 SĄJUNGOS VISKAS PASIRINKTI 3 SĄJUNGOS VISKAS PASIRINKTI 4 SĄJUNGOS VISKAS PASIRINKTI 5) z) x WHERE ASCII("a")+ skaičius -1 TARP ASCII("a") IR ASCII("z")

Tie, kurie dar nežino apie skaičių sekos generavimą, nukreipiu į atitinkamą straipsnį.

Kaip žinote, mažųjų ir didžiųjų raidžių kodai skiriasi. Todėl norėdami gauti visą rinkinį neperrašydami užklausos, tereikia pridėti panašų į aukščiau pateiktą kodą:

Manau, kad prireikus šią raidę pridėti prie lentelės nebus sunku.

Dabar panagrinėkime užduotį, kaip nustatyti, kur eilutės išraiškoje rasti norimą poeilelę. Tam gali būti naudojamos dvi funkcijos - CHARINDEX Ir PATINDEX. Jie abu grąžina eilutės poeilės pradinę padėtį (eilutės pirmojo simbolio vietą). Funkcija CHARINDEX turi tokią sintaksę:

CHARINDEX( paieškos_išraiška, eilutės_išraiška[, pradžios_pozicija])

Čia yra pasirenkamas sveikojo skaičiaus parametras pradžios_pozicija apibrėžia vietą eilutės išraiškoje, iš kurios atliekama paieška paieškos_išraiška. Jei šis parametras praleistas, paieška atliekama nuo pradžių eilutės_išraiška. Pavyzdžiui, prašyti

Reikėtų pažymėti, kad jei ieškoma poeilutė ar eilutės išraiška yra NULL, tai funkcijos rezultatas taip pat bus NULL.

Toliau pateiktame pavyzdyje nustatomos pirmojo ir antrojo simbolio „a“ pasireiškimo vietos laivo pavadinime „Kalifornija“.

Bet, pavyzdžiui, kaip rasti laivų pavadinimus, kuriuose yra trijų simbolių seka, kurių pirmasis ir paskutinis yra „e“:

Garinė pirtis į KAIRĖ funkcija TEISINGAI grąžina nurodytą simbolių skaičių į dešinę iš eilutės išraiškos:

RIGHT(<styginių išraiška>,<simbolių skaičius>)

Pavyzdžiui, štai kaip galite nustatyti laivų pavadinimus, kurie prasideda ir baigiasi ta pačia raide:

Čia klasės pavadinimą ir laivo pavadinimą atskiriame tarpu. Be to, kad nekartotų visos konstrukcijos kaip funkcijos argumento, naudojame antrinę užklausą. Rezultatas atrodys taip:

Norėdami pašalinti šį atvejį, galite naudoti kitą naudingą funkciją LEN (<styginių išraiška>) , kuris grąžina simbolių skaičių eilutėje. Apsiribokime tuo atveju, kai simbolių skaičius yra didesnis nei vienas:

Funkcija ATKARTOTI užpildo pastovųjį „abcde“ su penkiais tarpais dešinėje, į kuriuos funkcija neatsižvelgia LEN, - abiem atvejais gauname 5.
Funkcija DUOMENŲ ILGIS grąžina baitų skaičių kintamojo vaizde ir parodo skirtumą tarp CHAR ir VARCHAR tipų. DUOMENŲ ILGIS duos mums 12 už CHAR tipą ir 10 už VARCHAR tipą.
Kaip tikėtasi, DUOMENŲ ILGIS VARCHAR tipo kintamajam grąžino tikrąjį kintamojo ilgį. Bet kodėl CHAR tipo kintamasis rezultatas buvo 12? Esmė ta, kad CHAR yra tipas fiksuoto ilgio. Jei kintamojo reikšmė yra mažesnė už jo ilgį, o ilgį paskelbėme kaip CHAR(12), tada kintamojo reikšmė bus „sulygiuota“ su reikiamu ilgiu, pridėjus tarpus.

Svetainėje yra užduočių, kuriose reikia sutvarkyti (rasti maksimumą ir pan.) skaitine tvarka teksto formatu pateiktas reikšmes. Pavyzdžiui, lėktuvo sėdynės numeris („2d“) arba CD greitis („24x“). Problema ta, kad tekstas rūšiuojamas taip (didėjimo tvarka)

Jei norite išdėstyti vietas eilučių didėjimo tvarka, tada tvarka turėtų būti tokia

Jei apsiribosime tuo, gausime

Belieka tik rūšiuoti

Dalintis