web-dev-qa-db-fra.com

Renvoie une valeur si aucun enregistrement n'est trouvé

J'ai cette déclaration simple qui fonctionne:

SELECT idnumber FROM dbo.database WHERE number = '9823474'

Si le numéro n'existe nulle part dans la table, il échoue. Je voudrais ajouter quelque chose à cette déclaration qui dit:
SI AUCUN ENREGISTREMENT IS TROUVÉ RETOURNE NUL AU LIEU DE AUCUNE LIGNE.

Aucune suggestion?

33
user1042304

Encapsulez la requête dans une sous-requête pour transformer "aucune ligne" en une valeur NULL.

J'ai testé et vérifié cela avec PostgreSQL , SQL Server et MySQL . Fonctionne également avec SQLite

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id;

Dans Oracle vous devez sélectionner dans la table factice à une ligne DUAL comme ceci:

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM DUAL;

Vous pouvez faites la même chose dans MySQL pour des raisons de compatibilité, mais vous n'y êtes pas obligé.
Similaire dans Firebird

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM RDB$DATABASE;

Ceci le fait pour DB2 (comme commenta Sean ):

SELECT (SELECT id FROM tbl WHERE id = 9823474) AS id FROM SYSIBM.SYSDUMMY1;

Alternative avec UNION ALL

SELECT id FROM tbl WHERE id = 9823474
UNION  ALL
SELECT NULL -- FROM DUAL  -- for Oracle
FETCH FIRST 1 ROW ONLY;

Le SQL standard, mais je n'ai testé cela qu'avec Postgres, qui se présente comme suit:
Si une ligne est trouvée dans la première SELECT, elle est renvoyée. Postgres cesse de rechercher plus de lignes dès que la première est trouvée en raison de LIMIT 1 (FETCH FIRST 1 ROW ONLY).
La seconde SELECT n'est exécutée que si la première ne renvoie rien. Le type de données de la valeur NULL est déterminé automatiquement par le type de données tbl.id.

À propos de la clause LIMIT:

56
Erwin Brandstetter

Pour simplifier les choses, cela devrait fonctionner correctement. Si vous affectez cela à une variable basée sur le type de données de votre idnumber, vous serez en mesure d'évaluer si la valeur est null ou le retour réel idnumber.

SELECT ISNULL(
      (
         SELECT idnumber 
         FROM dbo.database 
         WHERE number = '9823474'
      ), NULL)
6
Sam Kort
Select isnull(sum(Amount),0) as Amt from BeginningBalance where CustomerID = @CustomerID
Union all
Select isnull(sum(Amount),0) as Amt from SalesOrders where CustomerID = @CustomerID
Union all
Select isnull(sum(Amount),0) as Amt from SalesInvoices where CustomerID = @CustomerID
//Data Row Result if no data is present at Beginning Balance Table
// example 

Amt
2000  // amount from sales orders
1000  // amount from sales invoices

// if the 1st select statement return no data use this
SELECT (select sum(Amount) from BeginningBalance 
        where CustomerID = @CustomerID) as Amt
Union all
Select sum(Amount) as Amt from SalesOrders where CustomerID = @CustomerID
Union all
Select sum(Amount) as Amt from SalesInvoices where CustomerID = @CustomerID

Résultat :

Amt
NULL  // amount from BeginningBalance
2000  // amount from sales orders
1000  // amount from sales invoices
3
Wilson

Je l'utilise pour MySql

SELECT IFNULL(ColumnA,"1") AS ColumnA , COUNT(1) AS Total FROM table 
WHERE ID = 1 LIMIT 0, 1;
0
Irfan Ashraf