J'ai une table de database "table_name1" dans SQL Server 2012 et j'utilise SQL Server Management Studio version 10.
Les données dans le tableau ressemblent à:
colpkey col1 col2 col3 1234 AB1234 AB1234 1265 BS5379 BS5379 BS5379 2323 WE7865 WE7865 WE7865 3267 WB7690 WB7690 6543 NULL DH6583 8798 NULL 9403 BF6543 NULL 9856 BH7548 BH7548 BH7548
La requête que j'ai utilisée pour créer cette table exemple de table:
create table table_name1 ( colpkey bigint primary key, col1 varchar(10) , col2 varchar(10), col3 varchar(10) );
Je veux écrire une requête de sorte qu'il devrait tirer deux colonnes, "colpkey" et "col". Le "col" devrait avoir une valeur de "col1". Si "col1" est NULL ou vide alors il devrait get la valeur de "col2". Si "col2" est NULL ou vide alors il devrait get la valeur de "col3". Et si tous "col1", "col2" et "col3" sont vides ou NULL alors la valeur mise dans "col" devrait être vide ('').
Ainsi, pour l'exemple donné "nom_table1", la requête doit extraire des données telles que:
colpkey col 1234 AB1234 1265 BS5379 2323 WE7865 3267 WB7690 6543 DH6583 8798 9403 BF6543 9856 BH7548
Comment puis-je écrire une requête pour le faire? J'essayais d'utiliser CASE et suis venu avec la requête suivante:
select colpkey, Case WHEN (col1 != null and col1!= '') then col1 ELSE (CASE WHEN (col2 != null and col2!= '') then col2 ELSE (CASE WHEN (col3 != null and col3!= '') then col3 ELSE '' END) END) END as col from table_name1;
Mais il est vide pour chaque ligne, comme:
colpkey col 1234 1265 2323 3267 6543 8798 9403 9856
S'il vous plaît suggérer où je vais mal avec la requête?
J'aime utiliser la fonction coalesce
SQL standard sur isnull
propriétaire de SQL Server pour find des valeurs non nulles, et nous pouvons également utiliser nullif
pour satisfaire l'exigence "vide":
select colpkey, coalesce(nullif(col1, ''), nullif(col2, ''), nullif(col3, ''), '') as col from table_name1;
METTRE À JOUR:
Pour répondre "où je me trompe avec la requête?" et comme mentionné par @ToddVrba, vous ne devriez pas comparer à null en utilisant des opérateurs de comparaison standard tels que égal, inférieur à et tels. Il est utile de considérer null comme "inconnu" dans la database relationnelle, ce qui signifie que comparer une valeur connue à une valeur inconnue donne toujours une valeur inconnue, ou null. Vous devriez comparer à null en utilisant is null
ou is not null
.
De plus, votre déclaration de cas est trop compliquée; vous avez seulement besoin d'une déclaration de cas, comme dans:
select colpkey, case when col1 is not null and col1 != '' then col1 when col2 is not null and col2 != '' then col2 when col3 is not null and col3 != '' then col3 else '' end as col from table_name1;
Bien que je trouve le combo coalesce et nullif pour être plus concis mais tout aussi lisible.
En SQL, vous ne pouvez pas comparer NULL
avec !=
. Vous devez faire IS NOT NULL
.