If I have the table
SELECT (Firstname || \'-\' || Middlename || \'-\' || Surname) AS example_column
FROM example_table
This will
NULLIF
expression reduces blank Middlename
to NULL
'-'
with a NULL
will always return NULL
VALUE
expression replaces NULL
s with an empty string_
SELECT Firstname || VALUE( '-' || NULLIF('Middlename',''),'') || '-' || Surname'
AS example_column
FROM example_table
If you use Postgres, concat_ws()
is what you are looking for:
SELECT concat_ws('-', Firstname, Middlename, Surname) AS example_column
FROM example_table
SQLFiddle: http://sqlfiddle.com/#!15/9eecb7db59d16c80417c72d1e1f4fbf1/8812
To treat empty strings or strings that only contain spaces like NULL
use nullif()
:
SELECT concat_ws('-', Firstname, nullif(trim(Middlename), ''), Surname) AS example_column
FROM example_table
One solution could be using case statement
select case Middlename is not null then (Firstname || '-' || Middlename || '-' || Surname)
else (Firstname || '-' || Surname) end AS example_column
from ....
You could use REPLACE
(if Oracle)
SELECT
REPLACE(Firstname || '-' || Middlename || '-' || Surname,'--','-')
AS example_column
FROM example_table;
Warning: I've assumed there is no valid name with -
as first or last character.
For downvoter
OP clearly said that:
SELECT (Firstname || '-' || Middlename || '-' || Surname) AS example_column FROM example_table
This will display Firstname-Middlename-Surname e.g.
John--Smith
So:
Middlename
is blank: ''
this solution works in SQLite/PostgreSQL/Oracle
Middlename
is NULL
and OP probably uses OracleAlthough Oracle treats zero-length character strings as nulls, concatenating a zero-length character string with another operand always results in the other operand, so null can result only from the concatenation of two null strings.
||
concatentaion operator:
-- PostgreSQL/SQLite
SELECT 'sth' || NULL
-- NULL
-- Oracle
SELECT 'sth' || NULL
-- sth
This approach works:
select first_name || coalesce('-' || middle_name, '') || '-' || last_name
from t;
Output:
| ?column? |
|-----------------|
| john-smith |
| jane-anne-smith |
UPDATE
Live code: http://sqlfiddle.com/#!15/d5a1f/1
Just as my inkling, someone will give a scenario that is not in the question. So to make it work with empty middle name. Just add a nullif for empty string:
select first_name || coalesce('-' || nullif(middle_name,'') , '') || '-' || last_name
from t;
Output:
| ?column? |
|-----------------|
| john-smith |
| obi-kinobi |
| jane-anne-smith |
You can use CASE
statement
select Firstname
|| case when Middlename <> '' Then '-'||Middlename else '' END
|| case when Surname<> '' Then '-'||Surname else '' END
As per your sample data I have check for empty string
. To check NULL
use Middlename IS NOT NULL
instead of Middlename <> ''