2016-05-19 6 views
7

Wenn ich die TabelleSQL auf einem Verkettungs Wenn Not Null mit

enter image description here

SELECT (Firstname || '-' || Middlename || '-' || Surname) AS example_column 
FROM example_table 

Dies wird Vorname-Nachname-Middle zeigen z

John--Smith 
Jane-Anne-Smith 

Die zweite (Jane) zeigt richtig, aber da John nicht middle hat, möchte ich es den zweiten Strich ignorieren.

Wie kann ich lege eine Art von IF Middle = NULL-Anweisung in so dass es nur John-Smith

+1

Sie markieren Sie müssen zurück die * * RDBMS **, das Sie verwenden. Im Allgemeinen * Zeichenfolge Verkettung * unterscheidet sich mit jedem Anbieter –

+0

Basierend auf der beliebten vier Datenbank, es ist entweder Oracle oder PostgreSQL –

Antwort

9

Hier wäre meine Vorschläge sein:

PostgreSQL und anderen SQL-Datenbanken, in denen 'a' || NULL IS NULL:

select firstname || coalesce ('-' || middlename, '') || '-' || surname ... 

Oracle und anderen SQL-Datenbanken, in denen 'a' || NULL = 'a':

select first name || decode (middlename, NULL, '', '-' || middlename) || '-' || surname... 

ich für Prägnanz gehen möchten . Hier ist es für einen Wartungsprogrammierer nicht sehr interessant, ob der zweite Name leer ist oder nicht. CASE-Switches sind völlig in Ordnung, aber sie sind sperrig. Ich möchte vermeiden, den gleichen Spaltennamen ("zweiter Vorname") wo immer möglich zu wiederholen.

Wie @Prdp bemerkte, ist die Antwort RDBMS-spezifisch. Spezifisch ist, ob der Server eine Zeichenfolge mit der Länge null behandelt, die der NULL entspricht, die bestimmt, ob die Verkettung einer NULL eine NULL ergibt oder nicht.

Im Allgemeinen ist COALESCE am prägnantesten für die PostgreSQL-Stil leere Zeichenfolge Handhabung und DECODE (*VALUE*, NULL, ''... für Oracle-Stil leere Zeichenfolge Handhabung.

+0

Keine Kommentare? :( –

+0

Hallo, danke für die Antwort. Ich war mit Oracle und die Decodierung arbeitete von mir. – BiscuitCookie

0

Sie könnten REPLACE würde angezeigt werden (falls Oracle)

SELECT 
    REPLACE(Firstname || '-' || Middlename || '-' || Surname,'--','-') 
    AS example_column 
FROM example_table; 

Warnung: Ich habe Angenommen, es gibt keinen gültigen Namen mit - als erstes oder letztes Zeichen.


Für downvoter

OP klar gesagt, dass:

SELECT (Firstname || '-' || Middlename || '-' || Surname) AS example_column 
FROM example_table 

Dies wird Vorname-Middle-Name angezeigt werden z.B.

John - Smith

So:

  1. Middlename ist leer: '' diese Lösung funktioniert in SQLite/PostgreSQL/Oracle
  2. MiddlenameNULL ist und OP nutzt wahrscheinlich Oracle

Obwohl Oracle Zeichenketten mit Nulllänge als Nullen behandelt, führt die Verkettung einer Zeichenkette mit einer Länge von Null mit einem anderen Operanden immer zum anderen Operanden. Daher kann null nur aus der Verkettung zweier Nullzeichenfolgen resultieren.

|| concatentaion Betreiber:

-- PostgreSQL/SQLite 
SELECT 'sth' || NULL 
-- NULL 


-- Oracle 
SELECT 'sth' || NULL 
-- sth 
+0

Beachten Sie dies Oracle NULL string = '' Operation angenommen. –

+0

Für den Downvoter hinterlassen Sie bitte einen Kommentar, warum diese Lösung ungültig ist. – lad2025

0

Eine Lösung case statement

select case Middlename is not null then (Firstname || '-' || Middlename || '-' || Surname) 
    else (Firstname || '-' || Surname) end AS example_column 
from .... 
0

verwenden werden konnten, können Sie verwenden CASE Anweisung

select Firstname 
     || case when Middlename <> '' Then '-'||Middlename else '' END 
     || case when Surname<> '' Then '-'||Surname else '' END 

Gemäß Ihren Beispieldaten habe ich nach empty string.Um zu überprüfen, NULL Verwendung Middlename IS NOT NULL statt Middlename <> ''

1

Dieser Ansatz works:

select first_name || coalesce('-' || middle_name, '') || '-' || last_name 
from t; 

Ausgang:

|  ?column? | 
|-----------------| 
|  john-smith | 
| jane-anne-smith | 

UPDATE

Live-Code: http://sqlfiddle.com/#!15/d5a1f/1

Genau wie meine Ahnung, wird jemand ein Szenario geben, das nicht in Frage steht. Also damit es mit dem leeren zweiten Vornamen klappt. Fügen Sie einfach einen nullif für leere Zeichenkette:

select first_name || coalesce('-' || nullif(middle_name,'') , '') || '-' || last_name 
from t; 

Ausgang:

|  ?column? | 
|-----------------| 
|  john-smith | 
|  obi-kinobi | 
| jane-anne-smith | 
+0

Versuchen Sie es erneut: 'mit cte als ( Wählen Sie 'Luke' als Vorname, 'Jedi' als MiddleName, 'Master' als Nachname aus Dual UNion alle Wählen Sie 'Darth' als Vorname, 'IamYourFather' als MiddleName, 'Vader' als Nachname von Dual UNion alle Wählen Sie 'Wierd' als Vorname, 'VaderSomeDaylater' als MiddleName, 'Yankovick' als Nachname aus Dual UNION ALLE Wählen Sie 'Obi' als Vorname, '' als MiddleName, 'Wankanobi' als Nachname aus dual Union alle Wählen Sie 'Michael' als Vorname, 'NoSoupForYou' als MiddleName, 'Buen' als Nachname von Dual ) wählen Sie Vorname || koaleszieren ('-' || Mittelname, '') || "-" || nachname von cte; ' – xQbert

+0

PostgreSQL-Stil leere Zeichenfolge Handhabung –

+0

@xQbert Antwort aktualisiert –

0

Dies ist eine sinnvolle Option sein kann:

SELECT FirstName || '-' || ISNULL(MiddleName + '-', '') || Surname 

Da eine NULL verketteten mit einem String einen NULL ergibt, wir kann versuchen, unsere Unterzeichenfolge zu erstellen und eine NULL durch eine leere Zeichenfolge zu ersetzen, die dann mit dem nächsten Teil des Namens verkettet wird.

Dies setzt voraus, dass Vorname und Nachname immer nicht NULL sind, aber Sie könnten die gleiche Logik auch dann anwenden.

+0

Wenn Ihr RDBMS kein ISNULL-Konstrukt hat, hat es wahrscheinlich eine COALESCE, die ähnlich funktioniert. – Shoeless

+0

Funktioniert nicht, wenn Middename eine leere Zeichenfolge enthält – Stavr00

+0

Leider sind Sie richtig, aber eine leere Zeichenfolge in der ursprünglichen Frage wurde nicht erwähnt (siehe @ Michael Buen Antwort auf die gleiche Situation). – Shoeless

3

Wenn Sie Postgres verwenden, ist concat_ws(), was Sie suchen:

SELECT concat_ws('-', Firstname, Middlename, Surname) AS example_column 
FROM example_table 

SQLFiddle: http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8812

leere Zeichenfolgen oder Zeichenfolgen zu behandeln, die nur Räume wie NULL Verwendung enthalten nullif():

SELECT concat_ws('-', Firstname, nullif(trim(Middlename), ''), Surname) AS example_column 
FROM example_table 
+0

basierend auf der Frage, die Antwort ist nicht vollständig. Der zweite Vorname sollte keinen doppelten Strich haben –

+0

@MichaelBuen: es gewann ' t. 'concat_ws()' wird sich darum kümmern. –

+0

+1 ordentlich :) Ich habe gerade Ihren Code mit einer leeren Zeichenfolge (nicht null) getestet, die sowieso nicht in der Frage ist, deshalb dachte ich, dass das nicht funktioniert hat. –

0
  • Die NULLIF Ausdruck reduziert blank Middlename-NULL
  • '-' mit einem NULL verketten immer NULL
  • Der VALUE Ausdruck ersetzt NULL s mit einem leeren String

_

SELECT Firstname || VALUE('-' || NULLIF('Middlename',''),'') || '-' || Surname' 
     AS example_column 
FROM example_table 
+0

Wie meine Antwort vor etwa 21 Minuten, außer dass Sie VALUE anstelle von COALESCE verwenden –

+0

Welches DBMS unterstützt diese 'value()' Funktion? –

+0

Ich nahm DB2 an. Aber die Lösung kann angepasst werden 'COALESCE()', 'ISNULL()' sind alternative Funktionen für andere Engines. – Stavr00