Come concatenare solo se non è nullo in SQL Server?

Sep 09 2020

Ho questo tavolo:

PersonTable

|  id  | name |
---------------
|  10  | Mike |
| NULL | Jane |

Voglio selezionare id e nome dalla tabella e utilizzare concat on id, ma solo se non è nullo, in questo modo:

+------+------+
|  Id  | Name |
+------+------+
| A10  | Mike |
| NULL | Jane |
+------+------+

Ho provato quanto segue:

SELECT ISNULL(concat('A', id), NULL) AS id, name FROM PeronTable

Ma la mia query restituisce questo:

+-----+------+
| Id  | Name |
+-----+------+
| A10 | Mike |
| A   | Jane |
+-----+------+

Risposte

3 GordonLinoff Sep 09 2020 at 11:01

Hmmm. Puoi usare +invece di concat():

select 'A' + convert(varchar(255), id), name
from t;

convert()(o cast()) è necessario assumendo che idsia un numero e non una stringa.

+restituisce NULLse un argomento è NULL; concat()ignora gli NULLargomenti.

Ovviamente puoi usare concat()con caseun'espressione:

select (case when id is not null then concat('A', id) end), name
from t;
1 AnkitDas Sep 09 2020 at 11:08

Puoi provare come il codice seguente per ottenere la soluzione prevista:

Select 'A' + convert(varchar(255), id) AS id, name
from PeronTable;

Ecco uno screenshot di esempio:

1 Ilyes Sep 09 2020 at 11:39

Puoi semplicemente usare NULLIF()come segue:

SELECT NULLIF(CONCAT('A', Id), 'A') Id,
       Name
FROM
(
  VALUES
  (10, 'Mike'),
  (NULL, 'Jane')
) T(Id, Name);

O

SELECT TT.Value Id,
       T.Name
FROM
(
  VALUES
  (10, 'Mike'),
  (NULL, 'Jane')
) T(Id, Name) CROSS APPLY(VALUES (NULLIF(CONCAT('A', Id), 'A'))) TT(Value);

La funzione CONCAT()restituirà 'A'se la Idcolonna è NULL, quindi devi solo controllare se ritorna 'A'usando la NULLIF()funzione che restituirà NULLse la stringa concatenata = A.

Puoi anche usare l' CASEespressione se vuoi come:

SELECT CASE WHEN TT.Value <> 'A' THEN Value END Id,
       T.Name
FROM
(
  VALUES
  (10, 'Mike'),
  (NULL, 'Jane')
) T(Id, Name) CROSS APPLY(VALUES (CONCAT('A', Id))) TT(Value);