Comment exécuter une requête SQL pour extraire des données de l'une des trois colonnes?

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 .