Ms sql-functies voor het werken met tekenreeksen. Transact-SQL-functies. Tekenreekslengte bepalen in SQL-query's

In dit deel zullen we het hebben over functies voor het werken met tekstinformatie die kunnen worden gebruikt in queries en programmacode in de PL/SQL-taal.

Functie CONCAT(strl, str2)

Deze functie voegt de strings strl en str2 samen. Als een van de argumenten NULL is, wordt het behandeld als een lege tekenreeks. Als beide argumenten NULL zijn, retourneert de functie NULL. Voorbeeld:

SELECT CONCAT("De priester had een hond") x1,
CONCATCTest" , NULL) x2,
CONCAT(NULL, "Test") x3,
CONCAT(NULL, NULL) x4
VAN dubbel

De priester had een hond

Om tekenreeksen samen te voegen, ondersteunt Oracle een speciale concatenatieoperator "||" die vergelijkbaar is met de CONCAT-functie, bijvoorbeeld:

SELECT CONCAT("De priester "had een hond") x1, "De priester " || "had een hond" x2
VAN dubbel

De aaneenschakelingsoperator "||", die equivalent is aan het aanroepen van de CONCAT-functie, mag niet worden verward met de "+"-operator die wordt gebruikt bij rekenkundige bewerkingen. In Oracle zijn dit verschillende operators, maar door automatische typecasting zijn subtiele fouten mogelijk, bijvoorbeeld:

SELECTEER "5" + "3" x1
VAN dubbel

In dit geval wordt de numerieke waarde 8 geretourneerd in plaats van de tekstreeks "53". Dit komt omdat wanneer Oracle de rekenkundige operator “+” detecteert, Oracle automatisch probeert de argumenten in NUMBER te typen.

Functie LAGER(str)

De LOWER-functie converteert alle tekens in str naar kleine letters. Voorbeeld:

SELECTEER LOWER("Text DATA") X
VAN dubbel

FunctieBOVEN(str)

De UPPER-functie converteert alle tekens in de string str naar hoofdletters. Voorbeeld:

SELECTEER UPPER("TeXt DATA") X
VAN dubbel

INITCAP(str)-functie

Retourneert de tekenreeks str waarbij de eerste letters van alle woorden zijn omgezet in hoofdletters. De functie is handig voor het opmaken van de volledige naam bij het samenstellen van rapporten. Voorbeeld:

SELECTEER INITCAPCIVANOV peter sidorovich") X
VAN dubbel

FunctiesLTRIM(str [,set])EnRTRIM(str [,set])

De LTRIM-functie verwijdert alle tekens vanaf het begin van de string tot aan het eerste teken dat niet in de ingestelde tekenset staat. Set bestaat standaard uit één spatie en mag niet worden opgegeven. De RTRIM-functie is vergelijkbaar met LTRIM, maar verwijdert tekens vanaf het einde van de tekenreeks. Laten we een paar voorbeelden bekijken:

SELECTEER LTRIM("TeXt DATA") X1,
LTRIM(" _ # TeXt DATA", " #_") X2,
LTRIM(" 1234567890 TeXt DATA", " 1234567890") X3
VAN dubbel

Functie VERVANGEN(str, zoek_str, [,vervang_str])

De functie REPLACE zoekt naar een zoek_str-patroon in de tekenreeks str en vervangt elk gevonden exemplaar door vervang_str. Standaard is Replace_str de lege tekenreeks, dus als u REPLACE met twee argumenten aanroept, worden alle gevonden exemplaren verwijderd. Het zoeken naar een subtekenreeks is hoofdlettergevoelig. Voorbeeld:

SELECT REPLACE("De priester had een hond", "hond", "kat") x1,
REPLACE("De priester had een boze hond", "kwaad") x2,
REPLACE("De priester had een hond", "Hond", "Kat") x3
VAN dubbel

De priester had een kat

De priester had een hond

De priester had een hond

Functie TRANSLATE(str, van_masker, naar_masker)

De functie TRANSLATE ontleedt de tekenreeks str en vervangt alle tekens die in de tekenreeks from_mask voorkomen door de overeenkomstige tekens van to_mask. Om de functie correct te laten werken, moeten de strings from_mask en to_mask dezelfde lengte hebben, of moet de string from_mask langer zijn dan to_mask. Als from_mask langer is dan to_mask, en tijdens het verwerken van de string str, karakters worden gevonden die overeenkomen met een van de from_mask karakters, en er is geen overeenkomst voor hen in to_mask, dan zullen dergelijke karakters uit de string str worden verwijderd. Als u from_mask of to_mask doorgeeft gelijk aan NULL, retourneert de functie NULL. De vergelijking is hoofdlettergevoelig gemaakt.

SELECT TRANSLATE("Test 12345", "e2\"E!") x1,
TRANSLATE("Test 12345", "e234", "E") x2
VAN dubbel

Deze functie is handig voor het oplossen van een aantal praktische problemen die verband houden met tekenconversie of het zoeken naar verboden tekens. U moet bijvoorbeeld een wachtwoord analyseren en nagaan of het minstens één cijfer bevat. De implementatie van deze controle met TRANSLATE ziet er als volgt uit:

ALS VERTALEN(PassWd, "0123456789", "*") = PassWd THEN
ADD_ERR0R("Fout - Wachtwoord moet minimaal één cijfer bevatten!");
RETOUR 1;
EINDIF;

Nog een voorbeeld: een nummer wordt voorbereid op de conversie naar NUMBER. Het is noodzakelijk om de decimale scheidingstekens "," en "." naar "." en verwijder spaties. De implementatie van deze bewerking met TRANSLATE ziet er als volgt uit:

SELECTEER VERTALEN("123 455.23", "., ", ". . ") x1,
VERTALEN("-123 455.23", ".,", ". . ") x2
VAN dubbel

Functie SUBSTR(str, m [,n])

De functie SUBSTR retourneert een fragment van de tekenreeks str, beginnend bij teken m, met een lengte van n tekens. De lengte mag niet worden gespecificeerd - in dit geval wordt de string geretourneerd vanaf het teken m tot het einde van de string str. Tekens worden genummerd vanaf 1. Als u m = 0 opgeeft, begint het kopiëren nog steeds vanaf het eerste teken. Als u een negatieve waarde voor m opgeeft, worden tekens vanaf het einde van de tekenreeks geteld in plaats van vanaf het begin. Het specificeren van waarden van m die in absolute waarde groter zijn dan de lengte van de string zorgt ervoor dat de functie NULL retourneert.

SELECT SUBSTR("De priester had een hond", 13) x1,
SUBSTR("De priester had een hond", -6) x2,
SUBSTR("Dit is testtekst", 5, 8) x3,
SUBSTR("De priester had een hond", 150) x4
VAN dubbel

tekst

Functie INSTR(str, zoek_str [,n[,m]])

De functie INSTR retourneert de positie van het eerste teken m-ro van het tekenreeksfragment str dat overeenkomt met search_str. De vergelijking wordt uitgevoerd vanaf het n-de teken van de string str; de vergelijking is hoofdlettergevoelig. Standaard is n = m = 1, dat wil zeggen dat de zoekopdracht wordt uitgevoerd vanaf het begin van de regel en dat de positie van het eerste gevonden fragment wordt geretourneerd. Als de zoekopdracht niet succesvol is, retourneert de functie 0.

SELECT INSTR("y kont was een hond", "hond") x1,
INSTR("y kont was een hond", "kat") x2,
INSTR("Dit is tekst om het zoeken naar tekst te demonstreren", "text", 1, 2) x3,
INSTR(‘11111000000001", "1", 7) x4
VAN dubbel

Met deze functie, evenals met alle andere in Oracle, worden vaak veelvoorkomende fouten gemaakt die verband houden met het verwerken van NULL-waarden. Als str=NULL, retourneert de functie NULL, niet nul! Hiermee moet rekening worden gehouden bij het construeren van verschillende voorwaarden. Dit fragment van een PL/SQL-programma houdt bijvoorbeeld geen rekening met deze functie:

ALS INSTR(TXT_VAR,"*") = 0 DAN
...
EINDEALS;

In dit geval zou het correct zijn om als volgt te schrijven:

ALS NVL(INSTR(TXT_VAR, "*"), 0) = 0 DAN
...
EINDIF;

LENGTH (str) en LENGTHB (str) functies

De functie LENGTH(str) retourneert de lengte van de tekenreeks str in tekens. Voor een lege tekenreeks en een NULL-waarde retourneert de functie NULL, dus het wordt aanbevolen om NVL in combinatie met deze functie te gebruiken.

SELECT LENGTH("De priester had een hond") x1,
LENGTE("") x2,
LENGTE(NUL) x3,
NVL(LENGTE(""), 0) x4
VAN dubbel

De functie LENGTHB is vergelijkbaar met de functie LENGTH, maar retourneert de lengte van de tekenreeks in bytes.

ASCII(str)-functie

Retourneert de ASCII-waarde van het eerste teken van de tekenreeks str bij gebruik van ASCII-tekencodering, en de waarde van de eerste byte van een multibyte-teken bij gebruik van multibyte-tekencodering. Voorbeeld:

SELECTEER ASCII("Test") x1 VAN dubbel

Functie CHR(n)

Retourneert een teken op basis van zijn code.

SELECTEER CHR(64) x1
VAN dubbel

Aan anderen. Het heeft de volgende syntaxis:

CONV(getal,N,M)

Argument nummer bevindt zich in grondtal N. De functie converteert het naar grondtal M en retourneert de waarde als een tekenreeks.

Voorbeeld 1

De volgende query converteert het getal 2 van decimaal naar binair:

SELECTEER CONV(2,10,2);

Resultaat: 10

Om het getal 2E van hexadecimaal naar decimaal te converteren, is de volgende query vereist:

SELECTEER CONV("2E",16,10);

Resultaat: 46

Functie TEKEN() converteert ASCII-code naar strings. Het heeft de volgende syntaxis:

TEKEN(n1,n2,n3..)

Voorbeeld 2

SELECTEER TEKEN(83,81,76);

Resultaat: SQL

De volgende functies retourneren de lengte van een tekenreeks:

  • LENGTE(tekenreeks);
  • OCTET_LENGTH(tekenreeks);
  • CHAR_LENGTH(tekenreeks);
  • CHARACTER_LENGTH(tekenreeks).

Voorbeeld 3

KIES LENGTE("MySQL");

Resultaat: 5

Soms is deze functie handig BIT_LENGTH(tekenreeks), die de lengte van de tekenreeks in bits retourneert.

Voorbeeld 4

SELECTEER BIT_LENGTH("MijnSQL");

Resultaat: 40

Functies voor het werken met substrings

Een substring is meestal een onderdeel van een string. Vaak moet u de positie weten van de eerste keer dat een subtekenreeks in een tekenreeks voorkomt. Drie functies lossen dit probleem in MySQL op:

  • LOCATE(subtekenreeks, tekenreeks [,positie]);
  • POSITIE(subtekenreeks, tekenreeks);
  • INSTR(tekenreeks; subtekenreeks).

Als de subtekenreeks niet in de tekenreeks voorkomt, retourneren alle drie de functies 0. De functie INSTR() verschilt van de andere twee in de volgorde van de argumenten. De functie LOCATE() kan een derde argument bevatten positie, waarmee u niet vanaf het begin naar een subtekenreeks in een tekenreeks kunt zoeken, maar vanaf een opgegeven positie.

Voorbeeld 5

SELECT LOCATE("Topaz", "open naamloze vennootschap Topaz");

Resultaat: 31

SELECT POSITION("Topaz", "open naamloze vennootschap Topaz");

Resultaat: 31

SELECT INSTR("open naamloze vennootschap Topaz",'Topaz');

Resultaat: 31

SELECT LOCATE("Topaz", "Topaz Plant en Topaz LLC", 9);

Resultaat: 20

SELECT LOCATE("Almaz", "Topaz Open Joint Stock Company");

Resultaat: 0

Functies LINKS(lijn, N) En RECHTS(tekenreeks, N) retourneer respectievelijk de meest linkse en meest rechtse N-tekens in de tekenreeks.

Voorbeeld 6

SELECTEER LINKS("MySQL DBMS", 4);

Resultaat: DBMS

SELECTEER RECHTS("MySQL DBMS", 5);

Resultaat: MySQL

Soms heb je een subtekenreeks nodig die op een bepaalde positie begint. Hiervoor worden de volgende functies gebruikt:

  • SUBSTRING(tekenreeks, positie, N);
  • MID(lijn, positie, N).

Beide functies retourneren N tekens van de gegeven string, beginnend op de opgegeven positie.

Voorbeeld 7

SELECT SUBSTRING("MySQL DBMS is een van de meest populaire DBMS", 6.5);

Resultaat: MySQL

Deze functie is erg handig bij het werken met e-mailadressen en websiteadressen. SUBSTR_INDEX(). De functie heeft drie argumenten:

SUBSTR_INDEX(tekenreeks, scheidingsteken, N).

Het N-argument kan positief of negatief zijn. Als het negatief is, vindt de functie het N-de exemplaar van het scheidingsteken, gerekend vanaf de rechterkant. Vervolgens wordt de subtekenreeks geretourneerd die zich rechts van het gevonden scheidingsteken bevindt. Als N positief is, vindt de functie het N-de exemplaar van het scheidingsteken aan de linkerkant en retourneert de subtekenreeks die zich links van het gevonden scheidingsteken bevindt.

Voorbeeld 8

SELECTEER SUBSTRING_INDEX("www.mysql.ru",".,2);

Resultaat: www.mysql

SELECT SUBSTRING_INDEX("www.mysql.ru",".",-2);

Resultaat: mysql.ru

Functie VERVANGEN(tekenreeks, subtekenreeks1, subtekenreeks2) Hiermee kunt u alle exemplaren van substring1 vervangen door substring2 in een string.

Basistekenreeksfuncties en -operatoren bieden een verscheidenheid aan mogelijkheden en retourneren als resultaat een tekenreekswaarde. Sommige stringfuncties bestaan ​​uit twee elementen, wat betekent dat ze op twee strings tegelijk kunnen werken. De SQL 2003-standaard ondersteunt stringfuncties.

Concatenatie-operator

SQL 2003 definieert de aaneenschakelingsoperator (||), die twee afzonderlijke tekenreeksen samenvoegt tot één tekenreekswaarde.

DB2-platform

Het DB2-platform ondersteunt de SQL 2003-concatenatieoperator en het synoniem daarvan, de CONCAT-functie.

MySQL-platform

Het MySQL-platform ondersteunt de CONCATQ-functie, een synoniem voor de SQL 2003-concatenatie-operator.

Oracle en PostgreSQL

De PostgreSQL- en Oracle-platforms ondersteunen de SQL 2003-aaneenschakelingsoperator met dubbele verticale balken.

SQL Server-platform

Het SQL Server-platform gebruikt het plusteken (+) als synoniem voor de SQL 2003-concatenatieoperator. SQL Server heeft een systeemparameter CONCAT_NULL_YIELDS_NULL die bepaalt hoe het systeem zich gedraagt ​​als NULL-waarden worden aangetroffen bij het aaneenschakelen van tekenreekswaarden.

/* SQL 2003-syntaxis */

string || tekenreeks2 || tekenreeks3

tekenreeks1tekenreeks2tekenreeks3

/* Voor MySQL */

CONCAT("stringl", "string2")

Als een van de samengevoegde waarden leeg is, wordt een lege string geretourneerd. Als er bovendien een numerieke waarde bij de aaneenschakeling betrokken is, wordt deze impliciet geconverteerd naar een tekenreekswaarde.

SELECT CONCAT("Mijn", "Bologna", "heeft", "een", "eerste", "naam...");

Mijn Bologna heeft een voornaam

SELECT CONCAT("Mijn ", NULL, "heeft", "eerste", "naam...");

CONVERTEREN en VERTALEN

De CONVERT-functie verandert de weergave van een tekenreeks binnen een tekenset en sortering. De CONVERT-functie kan bijvoorbeeld worden gebruikt om het aantal bits per teken te wijzigen.

De functie TRANSLATE vertaalt een tekenreekswaarde van de ene tekenset naar de andere. De functie TRANSLATE kan bijvoorbeeld worden gebruikt om een ​​waarde van de Engelse tekenset naar de Kanji (Japans) of Cyrillische (Russisch) tekenset te converteren. De vertaling zelf moet al bestaan: standaard opgegeven of gemaakt met de opdracht CREATE TRANSLATION.

SQL 2003-syntaxis

CONVERTEREN (character_value USING character_conversion_name)

TRANSLATE(karakter_waarde USING vertalingsnaam)

De functie CONVERT converteert een tekenwaarde naar de tekenset met de naam die is opgegeven in de parameter character_conversion_name. De functie TRANSLATE converteert een tekenwaarde naar de tekenset die is opgegeven in vertalingsnaam.

Van de besproken platforms ondersteunt alleen Oracle de functies CONVERT en TRANSLATE zoals gedefinieerd in de SQL 2003-standaard. Oracle's implementatie van de functie TRANSLATE lijkt sterk op, maar is niet identiek aan, SQL 2003. In deze implementatie neemt de functie slechts twee argumenten aan en vertaalt deze alleen tussen de databasetekenset en de voor de nationale taal geschikte tekenset.

MySQL's implementatie van de CONV-functie converteert alleen getallen van de ene basis naar de andere. De implementatie van de CONVERT-functie door SQL Server is behoorlijk rijk aan mogelijkheden en verandert het gegevenstype van de expressie, maar verschilt in alle andere opzichten van de SQL 2003-standaard CONVERT-functie. Het PostgreSQL-platform ondersteunt de CONVERT-functie niet, en de implementatie ervan de functie TRANSLATE converteert alle exemplaren van een tekenreeks naar een andere tekenreeks.

DB2

Het DB2-platform ondersteunt de functie CONVERT niet, en ondersteuning voor de functie TRANSLATE is niet ANSI-compatibel. De functie TRANSLATE wordt gebruikt om subtekenreeksen te transformeren en is van oudsher synoniem met de functie UPPER, omdat de functie UPPER pas onlangs aan DB2 is toegevoegd. Als de functie TRANSLATE in DB2 wordt gebruikt met één argument als tekenuitdrukking, is het resultaat dezelfde tekenreeks die is omgezet in hoofdletters. Als de functie wordt gebruikt met meerdere argumenten, zoals TRANSLATE(ucmo4HUK, vervangen, match), dan converteert de functie alle tekens in de bron die ook in de match-parameter voorkomen. Elk teken in de bron dat zich op dezelfde positie bevindt als in de matchparameter, wordt vervangen door het teken uit de vervangparameter. Hieronder ziet u een voorbeeld.

TRANSLATE("Hallo, Wereld!") "HALLO; WERELD!"

TRANSLATE("Hallo, Wereld1", "wZ", "1W") "Hewwo, Zorwd1

MySQL

Het MySQL-platform ondersteunt de functies TRANSLATE en CONVERT niet.

Orakel

Het Oracle-platform ondersteunt de volgende syntaxis voor de functies CONVERT en TRANSLATE.

In de implementatie van Oracle retourneert de functie CONVERT de tekst van een tekenwaarde die is geconverteerd naar de target_charset_set. De parameter char_value is de tekenreeks die moet worden geconverteerd, de target_charset_set is de naam van de tekenset waarin de tekenreeks moet worden geconverteerd, en de parameter source_charset is de tekenset waarin de tekenreekswaarde oorspronkelijk was opgeslagen.

De functie TRANSLATE in Oracle volgt de ANSI-syntaxis, maar u kunt slechts één van de twee tekensets kiezen: de databasetekenset (CHARJCS) en de tekenset in de nationale taal (NCHARJZS).

Oracle ondersteunt ook een andere functie, ook wel TRANSLATE genoemd (zonder het trefwoord USING te gebruiken). Deze TRANSLATE-functie heeft niets te maken met tekensetconversie.

De namen van de doel- en brontekensets kunnen worden doorgegeven als tekenreeksconstanten of als verwijzing naar een tabelkolom. Houd er rekening mee dat wanneer u een tekenreeks converteert naar een tekenset waarin niet alle tekens worden weergegeven die worden geconverteerd, u vervangende tekens kunt vervangen.

Oracle ondersteunt verschillende algemene tekensets, waaronder US7ASCII en WE8DECDEC. WE8HP, F7DEC, WE8EBCDIC500, WE8PC850u WE8ISO8859PI. Bijvoorbeeld:

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

PostgreSQL

Het PostgreSQL-platform ondersteunt de ANSI-standaard CONVERT-instructie, en conversies hier kunnen worden gedefinieerd met behulp van de opdracht CREATE CONVERSION. PostgreSQL's implementatie van de functie TRANSLATE biedt een uitgebreide reeks functies waarmee u elke tekst binnen een opgegeven tekenreeks naar andere tekst kunt transformeren.

TRANSLATE (tekenreeks, van_tekst, naar_tekst)

Hier zijn enkele voorbeelden:

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

SQL-server

Het SQL Server-platform ondersteunt de TRANSLATE-functie niet. De implementatie van de CONVERT-functie in SQL Server is niet compatibel met de SQL 2003-standaard. Deze functie in SQL Server is gelijkwaardig aan de CAST-functie.

CONVERTEREN (data_type[(lengte) | (precisie, schaal)], expressie, stijl])

De stijlclausule wordt gebruikt om het datumconversieformaat te definiëren. Zie de SQL Server-documentatie voor meer informatie. Hieronder ziet u een voorbeeld.

SELECT titel, CONVERT(char(7), ytd_sales) FROM titels ORDER OP titel GO


Hieronder vindt u een volledige lijst met de stringfuncties uit BOL:

ASCII NCHAR GELUIDEX
KAAR PATINDEX RUIMTE
CHARINDEX VERVANGEN STR
VERSCHIL QUOTENAAM SPULLEN
LINKS REPLICEER SUBSTRING
LEN ACHTERUIT UNICODE
LAGER RECHTS BOVENSTE
RTRIM RTRIM

Laten we beginnen met twee wederzijds gerelateerde functies: ASCII En TEKEN:

De ASCII-functie retourneert een ASCII-codewaarde van het meest linkse teken van een tekenuitdrukking, zijnde een functieargument.

Hier is een voorbeeld van de manier waarop u kunt bepalen met hoeveel verschillende letters de namen van de schepen in de Schepentabel beginnen:

SELECTEER COUNT(DISTINCT ASCII(naam)) VAN Schepen

Het resultaat is 11. Om erachter te komen wat deze letters zijn, kunnen we de CHAR-functie gebruiken die een teken retourneert met een bekende ASCII-codewaarde (van 0 tot 255):

SELECTEER DISTINCT CHAR(ASCII(naam)) VAN Schepen BESTEL OP 1

We moeten opmerken dat het identieke resultaat eenvoudiger kan worden gemaakt door nog een functie te gebruiken: LINKS dat de volgende syntaxis heeft:

LINKS (<karakter_expressie>, <geheel getal_expressie>)

en retourneert het deel van een tekenreeks beginnend bij een opgegeven aantal tekens vanaf de linkerkant. Dus,

SELECTEER DISTINCT LINKS(naam, 1) VAN Schepen BESTEL OP 1

En dit is de manier om de tabel met codes van alle alfabetische tekens te krijgen:

SELECT CHAR(ASCII("a")+ getal-1) letter, ASCII("a")+ getal - 1 FROM

(SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
KRUIS DOE MEE
KRUIS DOE MEE
)X
WHERE ASCII("a")+ getal -1 TUSSEN ASCII("a") EN ASCII("z")

Voor degenen die zich niet bewust zijn van het genereren van numerieke reeksen, verwijs ik naar het overeenkomstige artikel.

Het is bekend dat codewaarden van kleine letters en hoofdletters verschillen. Dat is de reden waarom, om de hele set te krijgen zonder de bovenstaande vraag te herschrijven, het voldoende zal zijn om dezelfde code als hierboven te schrijven:

UNIE
SELECT CHAR(ASCII("A")+ getal-1) letter, ASCII("A")+ getal - 1
VAN
SELECTEER 5*5*(a-1)+5*(b-1) + c ALS num VAN
(SELECT 1 a UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) x
KRUIS DOE MEE
(SELECTEER 1 b UNION ALLES SELECTEER 2 UNION ALLES SELECTEER 3 UNION ALLES SELECTEER 4 UNION ALLES SELECTEER 5) y
KRUIS DOE MEE
(SELECTEER 1 c UNION ALLES SELECTEER 2 UNION ALLES SELECTEER 3 UNION ALLES SELECTEER 4 UNION ALLES SELECTEER 5) z
)X
WHERE ASCII("A")+ num -1 TUSSEN ASCII("A") EN ASCII("Z")

Laten we nu eens kijken naar de taak van het zoeken naar een subtekenreeks in een tekenreeksexpressie. De twee functies kunnen hiervoor worden gebruikt: CHARINDEX En PATINDEX.

Ze retourneren allebei een startpositie (een positie van het eerste teken van een subtekenreeks) van een subtekenreeks in een tekenreeks. De functie CHARINDEX heeft de volgende syntaxis: CHARINDEX()

string_expressie, doel_expressie [, start_locatie] Hier een optionele integer-parameter start_locatie definieert een positie in a string_expressie , waarbij gezocht wordt naar een doel_expressie definieert een positie in a begint vanaf. Als dit argument wordt weggelaten, begint het zoeken vanaf het begin van a

.

De vraag bijvoorbeeld

SELECTEER naam FROM Schepen WHERE CHARINDEX("sh", naam) > 0
geeft aan dat schepen de reeks tekens "sh" in hun naam hebben. Hier maken we gebruik van het feit dat als een te vinden substring niet wordt gevonden, de functie CHARINDEX 0 retourneert. Het resultaat van het uitvoeren van de query zal de volgende schepen bevatten:
naam
Kirishima

Musashi , waarbij gezocht wordt naar een Washington definieert een positie in a We moeten er rekening mee houden dat als a

of

NULL is, is het resultaat van de functie ook NULL.
Het volgende voorbeeld bepaalt de posities van de eerste en tweede keer dat het teken "a" voorkomt in de naam van het schip "California"

SELECT CHARINDEX("a",naam) eerste_a,

CHARINDEX("a", naam, CHARINDEX("a", naam)+1) tweede_a PATINDEX Houd er rekening mee dat bij het bepalen van de tweede gebeurtenis de startpositie, gebruikt in de functie, de positie is van een teken naast de eerste "a" - CHARINDEX("a", naam)+1. De juistheid van het resultaat - 2 en 10 - kan eenvoudig worden gecontroleerd.

De functie heeft de volgende syntaxis:)

PATINDEX (

"%patroon%", string_expressie

Het belangrijkste verschil tussen deze functie en CHARINDEX is dat een zoekreeks jokertekens kan bevatten: % en _. Begin- en eindtekens "%" zijn vereist. Het gebruik van deze functie in het eerste voorbeeld ziet er bijvoorbeeld zo uit

SELECTEER naam FROM Schepen WHERE PATINDEX("%sh%", naam) > 0
En er is een manier om de namen van de schepen te vinden die de reeks van drie tekens bevatten, waarvan de eerste en de laatste "e" zijn:

SELECTEER naam VAN Schepen

SELECTEER naam FROM Schepen WHERE CHARINDEX("sh", naam) > 0
WHERE PATINDEX("%e_e%", naam) >0
Het resultaat van het uitvoeren van deze query ziet er als volgt uit:

CHARINDEX("a", naam, CHARINDEX("a", naam)+1) tweede_a RECHTS Wraak LINKS Koninklijke Soeverein

dat complementeert<karakter_expressie>,<geheel getal_expressie>)

retourneert een opgegeven aantal tekens vanaf de rechterkant van een tekenuitdrukking:

RECHTS(
Hier is bijvoorbeeld de manier om de namen te bepalen van de schepen die beginnen en eindigen met dezelfde letter:

Het feit dat we een lege resulterende set hebben, betekent dat dergelijke schepen afwezig zijn in onze database. Laten we een combinatie nemen: een klasse en een naam van een schip.

Het combineren van twee stringwaarden tot één heet aaneenschakeling, en in de SQL-server teken "+" wordt gebruikt voor deze bewerking ("||" in standaard).

Dus,
)X

SELECTEER * VAN (

Hier scheiden we per spatie de klasse en de naam van een schip. Om bovendien niet de hele constructie in het functieargument te herhalen, gebruiken we een subquery. Het resultaat ziet er als volgt uit:
cn
Iowa Missouri

Noord-Carolina Washington

Dus,
En wat als een tekenreeksexpressie slechts één teken bevat? De query zal deze uitvoeren. U kunt dit eenvoudig schriftelijk controleren
SELECTEER klasse +" "+ naam AS cn FROM Schepen
)X
UNION ALL SELECTEER "a" als nc

WAAR LINKS(cn, 1)=RECHTS(cn, 1) Om dit geval uit te sluiten, nog een nuttige functie definieert een positie in a) LEN(

Dus,
En wat als een tekenreeksexpressie slechts één teken bevat? De query zal deze uitvoeren. U kunt dit eenvoudig schriftelijk controleren
kan worden gebruikt. Het retourneert het aantal tekens in een string. Laten we ons beperken tot het hoofdlettergebruik, wanneer het aantal tekens groter is dan één:
)X
UNION ALL SELECTEER "a" als nc

WAAR LINKS(cn, 1)=RECHTS(cn, 1) EN LEN(cn)>1

Er zijn taken op de website die het normaliseren (maximaal vinden etc.) in een numerieke volgorde vereisen van waarden die worden weergegeven in een stringformaat, bijvoorbeeld een stoelnummer in een vlak ("2d") of een snelheid van CD ( "24x"). Het probleem ligt in het feit dat de tekst als volgt wordt gesorteerd (oplopend)
11.00 uur
1a

2a
SELECTEER "1a" ALS plaats
UNION ALLES SELECTEER "2a"
UNION ALLES SELECTEER "11a"

BESTEL VANAF 1

Als het sorteren van plaatsen in volgorde van toename van rijen vereist is, moet de volgorde als volgt zijn:
1a
1a

11.00 uur
Om een ​​dergelijke volgorde te krijgen, is het sorteren op numerieke waarden in de tekst nodig. Ik bied het volgende algoritme aan:
1. Haal een getal uit de string.
2. Converteer het naar een numeriek formaat.

3. Voer een sortering uit op basis van een geconverteerde waarde.

Omdat we weten dat er maar één letter in de string zit, en om er een getal uit te halen, kunnen we de volgende constructie gebruiken die niet afhankelijk is van een aantal cijfers in een stoelnummer:

LINKS(plaats, LEN(plaats)-1)

Als we ons hier maar aan houden, komen we wel
plaats
1a
11.00 uur

2a

Converteren naar een numeriek formaat kan er als volgt uitzien:

CAST (LINKS(plaats, LEN(plaats)-1) AS INT)

Dus,
Nu moeten we gewoon een sortering uitvoeren
SELECTEER "1a" ALS plaats
UNION ALLES SELECTEER "2a"
SELECTEER "1a" ALS plaats

) x BESTEL PER CAST(LINKS(plaats, LEN(plaats)-1) AS INT)

Voorheen gebruikten we de functie LINKS om een ​​getal uit een tekenreeksexpressie te extraheren, omdat we a priori wisten hoeveel tekens er van rechts (één) moesten worden verwijderd. En wat als we een string uit een substring zouden moeten extraheren, niet op basis van de bekende positie van een karakter, maar op basis van een karakter zelf? Extraheer bijvoorbeeld alle tekens vóór de eerste letter "x" (een waarde voor cd-snelheid).

In eerder dit geval kunnen we ook de weloverwogen CHARINDEX-functie gebruiken waarmee we de onbekende positie van het personage kunnen bepalen:

SELECTEER het model, LINKS(cd, CHARINDEX("x", cd) -1) VANAF PC

SUBSTRING functie

SUBSTRING (<uitdrukking> ,<begin>,<lengte>)

Met deze functie kunnen we uit een uitdrukking het deel van een opgegeven lengte extraheren, beginnend bij een opgegeven beginpositie. Een expressie kan een teken of een binaire tekenreeks zijn, maar kan ook een tekst- of afbeeldingstype hebben. Als we bijvoorbeeld drie tekens in een scheepsnaam moeten krijgen, beginnend bij het tweede teken, dan is het niet zo eenvoudig om dit te doen zonder de functie SUBSTRING. En dus schrijven we:

SELECTEER naam, SUBSTRING(naam, 2, 3) FROM Schepen

Als we alle karakters moeten extraheren, beginnend bij bepaalde, kunnen we deze functie ook gebruiken. Bijvoorbeeld,

SELECTEER naam, SUBSTRING(naam, 2, LEN(naam)) FROM Schepen

zal ons alle karakters in de namen van de schepen geven, te beginnen met de tweede letter van de naam. Houd er rekening mee dat ik, om het aantal te extraheren tekens te specificeren, de functie LEN(naam) heb gebruikt die een aantal tekens in de naam retourneert. Het is duidelijk dat, voor zover ik de tekens nodig heb, het aantal vanaf de tweede kleiner zal zijn dan het gehele aantal tekens in de naam. Maar het veroorzaakt geen fout, want als een bepaald aantal tekens groter is dan een toegestaan ​​aantal, worden alle tekens tot het einde van een string geëxtraheerd. Daarom neem ik het met enige reserve aan en bespaar mezelf de berekeningen.

ACHTERUIT functie

Deze functie keert een string om, net zoals u deze van rechts naar links leest. Dat is het resultaat van de vraag

SELECTEER OMGEKEERD("abcdef")

zal "fedcba" zijn. Als de functie RECHTS ontbreekt in de taal waarin de query wordt uitgevoerd

SELECTEER RECHTS("abcdef",3)

kan op dezelfde manier worden vervangen door de vraag

SELECTEER REVERSE(LINKS(REVERSE("abcdef"),3))

De winst van deze functie zie ik in het volgende. Laten we een positie bepalen, niet de eerste, maar de laatste keer dat een teken (of een reeks tekens) in een tekenreeks voorkomt.

Laten we een voorbeeld herinneren, waarbij we de positie van het eerste teken "a" in de naam van het schip "California" aan het bepalen waren:

SELECT CHARINDEX("a", naam) eerste_a
VAN Schepen WAAR naam = "Californië"

Laten we nu de positie bepalen van de laatste keer dat het teken "a" in deze naam voorkomt. De functie

CHARINDEX("a", REVERSE(naam))

zal ons in staat stellen deze positie te vinden, maar dan vanaf de rechterkant. Om de positie van dit personage te krijgen, maar vanaf links, is het voldoende om te schrijven

SELECT LEN(naam) + 1 - CHARINDEX("a", REVERSE(naam)) eerste_a
VAN Schepen WAAR naam = "Californië"

VERVANGEN functie

VERVANGEN(<tekenreeks_expressie1> , <tekenreeks_expressie2> , <tekenreeks_expressie3>)

Deze functie vervangt in de tekenreeks_expressie1 alle gebeurtenissen van de tekenreeks_expressie2 met de tekenreeks_expressie3. Deze functie is absoluut nuttig bij UPDATE operators, als we de inhoud van de kolom moeten wijzigen. Laten we bijvoorbeeld alle spaties vervangen door het koppelteken in de namen van de schepen.

Dan kunnen we schrijven
UPDATE schepen

SET naam = REPLACE(naam, " ", "-")

(Dit voorbeeld kunt u uitvoeren op de pagina met de DML-oefeningen, waar de vragen over het bijwerken van de gegevens worden toegelaten)

Deze functie kan echter ook in meer niet-triviale gevallen worden toegepast. Laten we bepalen hoe vaak de letter "a" wordt gebruikt in de naam van een schip. Het idee is vrij eenvoudig: laten we elke zoekletter vervangen door twee willekeurige tekens, en daarna berekenen we het lengteverschil van de string die we hebben en de bronstring. Dus,

SELECTEER naam, LEN(REPLACE(naam, "a", "aa")) - LEN(naam) FROM Schepen

En wat als we het aantal keren moeten bepalen dat een willekeurige reeks tekens voorkomt, die we bijvoorbeeld als parameter van een opgeslagen procedure krijgen? In dit geval moeten we het hierboven gebruikte algoritme aanvullen met de verdeling over een aantal tekens in een reeks:
VERKLAREN @str ALS VARCHAR(100)
SET @str = "ma"

SELECTEER naam, (LEN(REPLACE(naam, @str, @str+@str)) - LEN(naam))/LEN(@str) VAN Schepen Om het aantal zoektekens te verdubbelen, werd hier de aaneenschakeling @str+@str toegepast. Voor dit effect kunnen we echter nog een functie gebruiken: REPLICEER

dat het eerste argument zo vaak herhaalt als gespecificeerd door het tweede argument.

SELECTEER naam, (LEN(REPLACE(naam, @str, REPLICATE(@str, 2))) - LEN(naam))/LEN(@str) VAN Schepen

Dat wil zeggen dat we tweemaal de subtekenreeks herhalen die is opgeslagen in de variabele @str. SPULLEN Als we in een string niet een bepaalde reeks karakters moeten vervangen, maar een gespecificeerd aantal karakters, beginnend vanaf een bepaalde positie, is het eenvoudiger om de

functie:<karakter_expressie1> , <begin> , , <karakter_expressie2>)

Deze functie vervangt een subtekenreeks met een lengte van lengte dat begint vanaf de begin positie in de karakter_expressie1 met de karakter_expressie2.

Het voorbeeld. Verander de naam van een schip: voeg "_" (onderstrepingsteken) en een lanceringsjaar toe na de eerste 5 tekens. Als de naam minder dan 5 tekens bevat, vult u deze aan met spaties.

Deze taak kan met veel verschillende functies worden opgelost. We zullen proberen het te doen met de SPULLEN functie.

In de eerste benadering schrijven we (grenzend aan de selectiequery):

SELECT naam, STUFF(naam, 6, LEN(naam), "_"+gelanceerd) FROM Schepen

Ik gebruik LEN(naam) als het derde argument (aantal te vervangen tekens), omdat ik alle tekens tot het einde van de string moet vervangen, en daarom neem ik het met een reserve - het oorspronkelijke aantal tekens in de naam. Maar deze query retourneert nog steeds een fout. En de vraag staat niet in het derde argument, waar de aaneenschakeling van de stringconstante en de geheeltallige kolom optreedt. Dit is de typeconversiefout we kunnen nog een ingebouwde functie gebruiken - STR:

STR (<float_expressie> [ , <lengte> [ , <decimale> ] ])

Bij deze conversie wordt gewerkt aan de afronding, en a lengte specificeert de lengte van de resulterende tekenreeks.

Bijvoorbeeld,
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

Houd er rekening mee dat als de tekenreeksweergave van het getal kleiner is dan de opgegeven lengte, de voorloopspaties worden toegevoegd. Als het resultaat groter is dan de opgegeven lengte, wordt het fractionele deel afgekapt (met de afronding); als er een gehele waarde is, krijgen we het overeenkomstige aantal sterretjes "*".

STR(12345,4,0) ****

De standaardlengte is overigens 10 symbolen. Houd er rekening mee dat een jaar wordt weergegeven door vier cijfers, we zullen schrijven

SELECT naam, STUFF(naam, 6, LEN(naam), "_"+STR(gelanceerd, 4)) FROM Schepen

Alles klopt bijna. Het geval kan worden overwogen als het aantal symbolen in de naam kleiner is dan 6, omdat in dit geval de functie STUFF NULL oplevert. Welnu, we zullen tot het einde op het rek moeten zijn, wat verband houdt met het gebruik van deze functie in dit voorbeeld, terwijl we onderweg nog een stringfunctie toepassen. RUIMTE We voegen de spaties achteraan toe, zodat de naam bewust langer is dan 6. Er is een speciale

functie daarvoor<RUIMTE(>):

aantal_van_spaties

SELECT naam, STUFF(naam + SPACE(6), 6, LEN(naam), "_"+STR(gelanceerd,4)) FROM Schepen En RTRIM LTRIM

functies<karakter_expressie>)

LTRIM(<karakter_expressie>)

knip dienovereenkomstig de voorloop- en volgspaties van de tekenreeksexpressie, die standaard wordt geconverteerd naar de VARCHAR type.

Laten we zo'n string bouwen: naam van de passagier_identificatie van de passagier voor elk record uit de Passagierstabel. Als we schrijven

SELECTEER naam + "_" + CAST(id_psg AS VARCHAR) FROM Passagier,

we krijgen in het resultaat zoiets als:

Het houdt verband met het feit dat de kolomnaam het type heeft KAAR(30).

De korte string wordt met de spaties voor dit type toegevoegd aan de opgegeven dimensie (we hebben 30 symbolen).

LAGER En BOVENSTE LTRIM

De functie RTRIM zal ons hier helpen:<karakter_expressie>)

SELECT RTRIM(naam) + "_" + CAST(id_psg AS VARCHAR) FROM Passagier<karakter_expressie>)

LAGER(

BOVENSTE( GELUIDEX En VERSCHIL

converteer alle karakters van het argument dienovereenkomstig naar het onderste en bovenste register.<karakter_expressie>)

Deze functies blijken nuttig te zijn in vergelijking met de registerafhankelijke strings.<Een paar van de interessante functies>, <GELUIDEX(>)

VERSCHIL ( karakter_expressie_1 karakter_expressie_2

stellen ons in staat om de gelijk klinkende woorden te bepalen. SOUNDEX retourneert een code van vier tekens om de gelijkenis te evalueren, maar DIFFERENCE evalueert gewoon correct de gelijkenis van twee vergelijkende tekenreeksen.

UNICODE functie

Omdat deze functies geen Cyrillisch ondersteunen, verwijs ik hiernaar<BOL>)

voor de voorbeelden van het gebruik ervan.

NCHAR functie

Tot slot zullen we enkele functies en enkele voorbeelden van Unicode-gebruik aanhalen:<UNICODE (>)

nkarakter_expressie

retourneert de Unicode-waarde voor het eerste teken van de invoerexpressie.

NCHAR (

geheel getal

retourneert een teken met de opgegeven gehele Unicode-waarde. Een paar voorbeelden:

SELECTEER ASCII("a"), UNICODE("a")

Retourneert de ASCII-codewaarde en de Unicode-waarde van de Russische letter "a": 224 en 1072.

SELECTEER CHAR(ASCII("a")), CHAR(UNICODE("a"))

We proberen een symbool te herstellen aan de hand van de codewaarde. We krijgen "a" en NULL. De NULL-waarde retourneert omdat de codewaarde 1072 ontbreekt in de gebruikelijke codetabel.

SELECTEER TEKEN(ASCII("a")), NCHAR(UNICODE("a"))

Nu is het in orde, 'a' in beide gevallen. SELECTEER NCHAR(ASCII("а"))

Windows snel afsluiten (Windows NT/2000/XP) Met Windows NT versie 3.1 en 3.5 kon u alle processen in 20 seconden afsluiten. In Windows NT 3.51 en hoger is het mogelijk om het interval te bepalen waarin het systeem moet worden afgesloten. Om dit te doen, moet u de sleutel repareren

Uit het boek Databaseverwerking in Visual Basic®.NET auteur McManus Geoffrey P

HOOFDSTUK 3 Introductie van SQL Server 2000 In het verleden begonnen veel programmeurs databasetoepassingen te maken met behulp van Visual Basic en een Microsoft Access-database met Jet-engine. Ooit groeide de database uit tot enkele duizenden records of werden de diensten ervan door meerdere gebruikt

Uit het boek Windows Script Host voor Windows 2000/XP auteur Popov Andrej Vladimirovitsj

Vereisten voor het installeren van SQL Server 2000 Om SQL Server 2000 te installeren, hebt u een computer nodig met een Pentium-processor (of compatibel) met een frequentie van minimaal 166 MHz, ruimte op de harde schijf van 95 tot 270 MB (270 MB voor een standaardinstallatie en 44 MB). MB voor Desktop Engine), schijfstation

Uit het boek Waar Delphi-boeken niet over schrijven auteur Grigoriev A. B.

SQL Server 2000 installeren Nadat u een computer met de vereiste configuratie heeft geselecteerd, kunt u doorgaan met de installatie. Over het geheel genomen is het installatieproces van SQL Server 2000 heel eenvoudig, afgezien van de volgende kenmerken: het duurt behoorlijk lang; tijdens het installatieproces wordt er veel gevraagd voor het eerste

Uit het boek PHP Reference van de auteur

Basisprincipes van SQL Server 2000 Zodra SQL Server is geïnstalleerd en actief is, moet u de volgende stappen uitvoeren voordat u gegevens kunt ophalen of opslaan: Maak een of meer databases. maak tabellen in de database; weergaven maken en opslaan

Uit het XSLT-boek auteur Holzner Stefanus

Functies voor het werken met arrays In tabel. Tabel A2.17 toont functies die kunnen worden gebruikt om nieuwe arrays te maken en informatie over bestaande arrays te verkrijgen. Functies voor het werken met arrays Functie Beschrijving Array(arglist) Geeft een variantwaarde terug die is

Uit het boek Linux: de complete gids auteur Kolisnichenko Denis Nikolajevitsj

3.3. Subtiliteiten van het werken met strings In deze sectie zullen we kijken naar enkele subtiliteiten van het werken met strings, waardoor we beter kunnen begrijpen welke code de compiler genereert voor sommige ogenschijnlijk elementaire acties. Niet alle hier gegeven voorbeelden werken op dezelfde manier.

Uit het boek The Art of Shell Scripting Language Programming van Cooper Mendel

Uit het boek The C Language - Een gids voor beginners van Prata Steven

XPath-functies voor het werken met strings De volgende XPath-functies voor het werken met strings zijn beschikbaar in XSLT: concat(string string1, string string2,...). Retourneert de aaneenschakeling (vereniging) van alle strings die eraan zijn doorgegeven; bevat(tekenreeks tekenreeks1, tekenreeks tekenreeks2). Retourneert waar als de eerste tekenreeks de tweede bevat

Uit het boek Linux en UNIX: shell programmeren. Handleiding voor ontwikkelaars. van Tainsley David

23.2.2. Functies voor het werken met geheugen Functies voor het werken met geheugen van de Glib-bibliotheek voeren dezelfde acties uit als de overeenkomstige functies van de C-taal. Hier zijn hun prototypen: gpointer g_malloc(gulong size); g_free(gpointer

Uit het boek Beschrijving van de PascalABC.NET-taal auteur RuBoard-team

Uit het boek van de auteur

13. Tekenreeksen en functies op tekenreeksen KARAKTERSTRINGS INITIALISATIE VAN KARAKTERSTRINGS INPUT-OUTPUT STRINGS MET FUNCTIES DIE WERKEN MET STRINGS OPDRACHTARGUMENTEN

Uit het boek van de auteur

FUNCTIES DIE MET STRINGS WERKEN De meeste C-taalbibliotheken zijn uitgerust met functies die met strings werken. Laten we eens kijken naar de vier meest bruikbare en meest voorkomende: strlen(), strcat(), strcmp() en strcpy(). We hebben de functie strlen() al gebruikt, die de lengte van een string vindt.

Uit het boek van de auteur

Uit het boek van de auteur

Routines voor het werken met karakters en strings functioneren Chr(a: byte): char;

Uit het boek van de auteur

Converteert de code naar een Windows-coderingskarakterfunctie ChrUnicode(a: word): char;