sql >> Databasteknik >  >> RDS >> Database

2 sätt att välja rader som matchar alla objekt i en lista (T-SQL)

Den här artikeln presenterar två sätt att välja rader baserat på en lista med ID:n (eller andra värden) i SQL Server. Detta kan vara användbart i scenarier där du har en kommaseparerad lista med ID:n och du vill fråga din databas efter rader som matchar dessa ID:n.

Säg att du har följande lista med ID:n:

1,4,6,8

Och så du vill nu fråga en tabell för poster som har något av dessa värden (dvs. antingen 1, 4, 6 eller 8) i dess ID-kolumn.

Här är två sätt att gå tillväga.

Alternativ 1:IN-operatören

Ett alternativ är att använda IN operatorn i din fråga för att endast returnera de rader som anges i listan.

SELECT ArtistId, ArtistName
FROM Artists
WHERE ArtistId IN (1,4,6,8);

Resultat:

ArtistId  ArtistName               
--------  -------------------------
1         Iron Maiden              
4         Buddy Rich               
6         Jim Reeves               
8         Maroon 5                 

Som du kan se är värdena i ArtistId kolumnen matchar de i listan.

Alternativ 2:STRING_SPLIT()-funktionen

Från och med SQL Server 2016, STRING_SPLIT() funktion kan användas för att dela upp ett teckenuttryck med en specificerad avgränsare. Med andra ord kan du använda den för att dela upp en kommaavgränsad lista.

Här är ett exempel som använder samma data som i föregående exempel:

SELECT ArtistId, ArtistName
FROM Artists
JOIN STRING_SPLIT('1,4,6,8', ',')
ON value = ArtistId;

Resultat:

ArtistId  ArtistName               
--------  -------------------------
1         Iron Maiden              
4         Buddy Rich               
6         Jim Reeves               
8         Maroon 5                 

En fördel med  STRING_SPLIT() är att det tillåter/(kräver) att du kan ange vad som används som avgränsare för listan. Detta kan vara praktiskt när din lista använder ett annat tecken som avgränsare.

Här är samma exempel, men för en blankstegsseparerad lista:

SELECT ArtistId, ArtistName 
FROM Artists JOIN STRING_SPLIT('1 4 6 8', ' ') 
ON value = ArtistId;

Resultat:

ArtistId  ArtistName               
--------  -------------------------
1         Iron Maiden              
4         Buddy Rich               
6         Jim Reeves               
8         Maroon 5                 

Kompatibilitetsnivå

Observera att STRING_SPLIT() är endast tillgänglig på databaser med en kompatibilitetsnivå på 130 eller högre. Du kan ändra en databas kompatibilitetsnivå med följande uttalande:

ALTER DATABASE MyDatabase SET COMPATIBILITY_LEVEL = 130;

Eller för att få upp den till SQL Server 2017-nivå:

ALTER DATABASE MyDatabase SET COMPATIBILITY_LEVEL = 140;

Var MyDatabase är namnet på databasen.

Se även Hur man kontrollerar en databas kompatibilitetsnivå i SQL Server.


  1. Bästa sättet att implementera en revisionsspår i SQL Server?

  2. 3 otäck I/O-statistik som fördröjer SQL-frågeprestanda

  3. Fråga till ORDER BY antalet rader som returneras från en annan SELECT

  4. Hur man ändrar värden för Redigera Top X och Välj Top X Rows i SQL Server Management Studio(SSMS) - SQL Server / TSQL Tutorial Del 20