sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man sammanfogar sträng- och NULL-värden i SQL Server

Problem:

Du vill sammanfoga NULL med strängvärden från en annan kolumn i SQL Server.

Exempel:

Vår databas har en tabell som heter children med data i följande kolumner:id (primär nyckel), förnamn , mellannamn och efternamn .

id förnamn mellannamn efternamn
1 Linda NULL Jackson
2 Maria Alice Thomson
3 NULL Steven NULL
4 NULL NULL Brun

Vi vill visa förnamnet från en kolumn, mellannamnet från nästa kolumn och efternamnet från den sista kolumnen som en sträng, även om en av kolumnerna lagrar en NULL.

Lösning 2:

Vi använder CONCAT() fungera. Här är frågan du skulle skriva:

SELECT 
  CONCAT(first_name,  middle_name, last_name) AS name
FROM children;

Här är resultatet:

namn
LindaJackson
MaryAliceThomson
Steven
Brun

Diskussion:

Använd CONCAT() funktion för att sammanfoga strängvärden från uttryck eller kolumner som innehåller en NULL. Denna funktion tar en lista med strängar (eller NULL) och visar alla dessa värden i en sträng. Det finns ingen separator mellan värdena, så resultaten (som i vårt exempel) kanske inte är formaterade som du förväntar dig. Hur kan vi rätta till detta? Titta på en annan CONCAT() fråga:

Lösning 2:

Här är ett annat frågealternativ:

SELECT 
  CONCAT(first_name,' ' , middle_name, ' ',last_name) AS name
FROM children;

Här är resultatet:

namn
Linda Jackson
Mary Alice Thomson
Steven
Brun

Nu, förutom strängvärden, tar den här funktionen också några mellanslag (placerade mellan de sammanlänkade värdena). Detta skiljer en del av namnet från en annan. Men som vi ser är denna lösning inte heller idealisk; fullständiga namn utan mellannamn har ett extra mellanslag, medan posterna med endast ett namn har två extra mellanslag.

I det här fallet, CONCAT_WS() funktion är den bättre lösningen.

Lösning 3:

CONCAT_WS() funktion tar ytterligare ett första argument:ett tecken som fungerar som en separator mellan strängar. Här är frågan:

SELECT 
  CONCAT_WS(' ' , first_name, middle_name, last_name) AS name
FROM children;

Och resultatet:

namn
Linda Jackson
Mary Alice Thomson
Steven
Brun

Den här frågan visar barnens fullständiga namn, utan onödiga mellanslag.


  1. Hur man optimerar PostgreSQL logisk replikering

  2. Hur undkommer man kommatecken och dubbla citattecken samtidigt för CSV-fil?

  3. Hur olika är PostgreSQL från MySQL?

  4. Jobbkö som SQL-tabell med flera konsumenter (PostgreSQL)