sql >> Databasteknik >  >> RDS >> Sqlserver

CHARINDEX() vs PATINDEX() i SQL Server – Vad är skillnaden?

I SQL Server kan du använda antingen CHARINDEX() funktion eller PATINDEX() funktion för att hitta en sträng i en sträng. Dessa är Transact-SQL-strängfunktioner och de är också tillgängliga i Azure-databaser.

På ytan verkar dessa funktioner göra exakt samma sak, och i många fall kan du använda vilken du föredrar att använda.

Det finns dock ett par distinktioner som kan diktera vilken funktion du väljer att använda i vissa scenarier. Dessa kan sammanfattas med följande:

  • PATINDEX() låter dig använda jokertecken för att söka efter mönster. CHARINDEX() inte.
  • CHARINDEX() accepterar ett tredje argument som låter dig ange startpositionen för sökningen. PATINDEX() inte.

Mer information om dessa punkter nedan.

Definition

Låt oss först titta på den officiella definitionen eller varje funktion.

CHARINDEX()
Söker efter ett teckenuttryck i ett andra teckenuttryck, och returnerar startpositionen för det första uttrycket om det hittas.
PATINDEX()
Återställer startpositionen för den första förekomsten av ett mönster i ett angivet uttryck, eller nollor om mönstret inte hittas, på alla giltiga text- och teckendatatyper.

Syntax

Och här är den officiella syntaxen för varje funktion.

CHARINDEX()

CHARINDEX ( expressionToFind , expressionToSearch [ , start_location ] )

PATINDEX()

PATINDEX ( '%pattern%' , expression )

Så båda funktionerna låter dig söka efter ett teckenuttryck, dock PATINDEX() funktionen låter dig söka efter ett mönster . Så detta är extra funktionalitet som du inte får med CHARINDEX() fungera. Med PATINDEX() du kan använda jokertecken för att ange ett mönster att söka, vilket kan vara väldigt praktiskt i vissa situationer.

Men CHARINDEX() accepterar tre argument medan PATINDEX() accepterar bara två. CHARINDEX() funktion accepterar ett valfritt tredje argument som låter dig ange startpositionen för sökningen. Med andra ord, CHARINDEX() funktionen låter dig endast returnera de matchningar som inträffar efter en viss punkt i strängen.

Exempel

Här är exempel som visar den extra funktionalitet som varje funktion ger.

CHARINDEX()

Här ger jag ett tredje argument för att ange en position för att börja söka. I det här fallet kommer den att hoppa över den första förekomsten av Bob och det kommer att returnera positionen för den andra förekomsten.

SELECT CHARINDEX('Bob', 'Bob likes beer. Bob also likes beef.', 16);

Resultat:

17

Så som nämnts kan du inte göra detta med PATINDEX() eftersom den inte accepterar den tredje parametern.

PATINDEX()

Här är ett exempel på något du kan göra med PATINDEX() som du inte kan göra med CHARINDEX() . I det här exemplet använder vi jokertecken för att söka efter ett mönster:

SELECT PATINDEX('%b_er%', 'Bob likes beer.');

Resultat:

11

I det här fallet använder vi procenttecknen (% ) som är jokertecken för att indikera att valfritt antal tecken kan fortsätta och efterfölja vår söksträng. Vi använder också understrecket (_ ) som är ett jokertecken för någon singel tecken.

Slutsats

Så medan både CHARINDEX() och PATINDEX() tillhandahålla liknande funktionalitet, och i många fall kan antingen den ena användas istället för den andra, det finns tillfällen då du skulle behöva använda den ena framför den andra.

Specifikt skulle du använda CHARINDEX() när du vill ange en startposition inom strängen för att söka. Och du skulle använda PATINDEX() närhelst du behöver ange ett mönster att söka efter.


  1. Uppdatera en kolumn i en tabell med en kolumn i en annan tabell i PostgreSQL

  2. Varför ska du lära dig PostgreSQL?

  3. Hur man grupperar en rapport i Access 2016

  4. Vad är anledningen / användbarheten är att använda ENABLE nyckelord i oracle databas uttalanden