J'ai le document SQL CODE> SQL suivant: ossature code> qui ne semble pas évaluer correctement le conditionnel. Ce tableau est actuellement vide (0 rangées non nulles) afin que je suppose que la condition sinon code> doit être vraie et donc émettre la chaîne de texte ci-dessous. Cependant, cela ne remplit rien dans les résultats.
SELECT
CASE WHEN EC.INV_ITEM_ID <> '' THEN EC.INV_ITEM_ID
ELSE 'NO ITEMS IN STAGING TABLES'
END
FROM PS_MASTER_ITEM_EC EC
ORDER BY INV_ITEM_ID
8 Réponses :
Vous ne pouvez pas retourner des enregistrements d'une table vide. La déclaration de cas est en cours d'évaluation contre chaque enregistrement du tableau. Lorsqu'il n'y a pas de dossier, il n'y aura rien à évaluer, donc le jeu de résultats vide. Il y a quelques façons de vérifier cette condition. Si le client s'attend à un ensemble de résultats spécifique et vérifie un champ connu pour l'existence de données (qui semble hacky), vous pouvez renvoyer des données similaires à partir d'un ensemble de résultats dérivé avec votre messagerie, toutefois, DECLARE @PS_MASTER_ITEM_EC TABLE(INV_ITEM_ID NVARCHAR(200))
--INSERT @PS_MASTER_ITEM_EC VALUES ('I''m Here')
IF(NOT EXISTS(SELECT EC.INV_ITEM_ID FROM @PS_MASTER_ITEM_EC EC))
SELECT INV_ITEM_ID = 'NO ITEMS IN STAGING TABLES'
ELSE
SELECT
CASE WHEN EC.INV_ITEM_ID <> '' THEN EC.INV_ITEM_ID
ELSE 'EC.INV_ITEM_ID has an empty string for a value'
END AS INV_ITEM_ID
FROM @PS_MASTER_ITEM_EC EC
ORDER BY INV_ITEM_ID
IF ((SELECT COUNT(*) FROM PS_MASTER_ITEM_EC EC WHERE EC.INV_ITEM_ID <> '' AND EC.INV_ITEM_ID IS NOT NULL) > 0) SELECT EC.INV_ITEM_ID FROM PS_MASTER_ITEM_EC EC WHERE EC.INV_ITEM_ID <> '' AND EC.INV_ITEM_ID IS NOT NULL ELSE SELECT 'NO ITEMS IN STAGING TABLES' First line will calculate how many non empty rows there are in the table second line will return a 1 column table with all the IDs that were not NULL or '' if any is found at all 4th row will return the default message if the table was actually empty
Votre problème est que votre case code> n'est évalué que pour des lignes existantes, si votre table est vide, vous n'obtiendrez aucun enregistrement.
Mais, vous voulez obtenir un disque avec un message Même si la table est vide, vous devez créer cette ligne.
Vous pouvez le faire en utilisant Ainsi, vous pouvez simplement répertorier tous vos enregistrements S'il y en a,
et montrez votre message lorsque Union code> pour ajouter une nouvelle ligne au jeu de résultats uniquement lorsque
ps_master_item_ec code> est vide. P>
ps_master_item_ec code> est vide. p>
SELECT EC.INV_ITEM_ID, NULL Message
FROM PS_MASTER_ITEM_EC EC
ORDER BY INV_ITEM_ID
UNION ALL
SELECT NULL INV_ITEM_ID, 'NO ITEMS IN STAGING TABLES' Message
WHERE NOT EXISTS(SELECT TOP 1 'X' X FROM PS_MASTER_ITEM_EC )
Toutes les valeurs d'une colonne doivent avoir le même type de données. Donc, si la colonne Si ce n'est pas le cas, vous devrez convertir les identifiants en chaînes pour correspondre à ceci dans le cas où il existe des enregistrements. Personnellement, je conseillerais à ce sujet, car il est comme le mélange de la craie et du fromage - une valeur de chaîne n'appartient pas vraiment à une colonne d'identité numérique - et même si les identifiants se produisent, il est toujours discutable comme sémantiquement la chaîne "Aucun résultat" ISN 'T un identifiant. p> mais si vous vraiment em> veux le faire, quelque chose comme le SQL suivant peut y parvenir: P> INV_ITEM_ID CODE> est utilisée pour une valeur de chaîne de
'Aucun élément dans les tables de stadification' code> dans le cas où il n'y a pas d'enregistrement, la colonne doit avoir un Type de données textuelle.
SELECT 'NO ITEMS IN STAGING TABLES' AS INV_ITEM_ID
WHERE NOT EXISTS (SELECT * FROM PS_MASTER_ITEM_EC)
UNION ALL
SELECT CAST(INV_ITEM_ID AS VARCHAR(26))
FROM PS_MASTER_ITEM_EC EC
ORDER BY INV_ITEM_ID;
Un n'existe pas code> La requête serait plus facile à comprendre, IMHO:
Sélectionnez 'Aucun article dans la mise en scène des tables d'action' comme inv_Item_id à partir de ps_master_item_ec où n'existe pas (sélectionnez 1 à partir de ps_master_item_ec) code>
D'accord, merci - j'ai modifié la réponse en conséquence. (Effectivement nécessaire pour omettre la clause à partir de code> car elle ne provoque aucune ligne à présenter.)
SQL Server est une base de données code> relationnelle code>. Bases de données relationnelles fonctionne d'éteint ensembles code>, qui est essentiellement une liste d'enregistrements. S'il n'y a pas d'enregistrement, votre fonction / logique (
code> dans ce cas ne peut pas être appliquée. Si vous avez besoin d'un enregistrement renvoyé lorsque votre requête renvoie zéro enregistrement, vous devez fournir un enregistrement d'une autre source à renvoyer. Une façon de faire qui donne un enregistrement via
Union code> avec un
où la clause code> qui garantit un enregistrement spécial est renvoyée lorsque le jeu de résultats est vide. Lorsque le jeu de résultats n'est pas vide, alors
où code> clause garantit que ce nouvel enregistrement n'est pas retourné. Le gotcha est ici que, cet enregistrement spécial doit avoir le même nombre de colonnes que le résultat de la requête régulière et avec les mêmes types de données compatibles ou compatibles.
; WITH cte (
---- your complex query goes here
select colString, colNumeric
.............
)
SELECT colString, colNumeric FROM cte
UNION ALL
SELECT 'no result found' as colString, NULL as colNumeric WHERE NOT EXISTS (SELECT * FROM cte) --- this returns true only if no record in cte
Utilisation d'une expression de table commune (CTE), une pour la requête principale (votre requête) et une autre pour vérifier si la table que vous souhaitez intéresser est vide.
WITH MainQuery AS ( SELECT CASE WHEN EC.INV_ITEM_ID <> '' THEN EC.INV_ITEM_ID END AS INV_ITEM_ID FROM PS_MASTER_ITEM_EC EC ), EmptyTableMessage AS ( SELECT CASE WHEN (SELECT COUNT(*) FROM MainQuery) > 0 THEN '' ELSE 'NO ITEMS IN STAGING TABLES' END AS EmptyMessage ) SELECT EmptyTableMessage.EmptyMessage, MainQuery.* FROM EmptyTableMessage LEFT OUTER JOIN MainQuery ON 1 = 1 ORDER BY MainQuery.INV_ITEM_ID
Il pourrait être obtenu en utilisant Scénarios: P> rejoindre gauche code>:
CREATE TABLE PS_MASTER_ITEM_EC(INV_ITEM_ID NVARCHAR(10));
-- case 1: empty value
INSERT INTO PS_MASTER_ITEM_EC VALUES ('');
-- NO ITEMS IN STAGING TABLES
-- case 2: empty table
TRUNCATE TABLE PS_MASTER_ITEM_EC
-- NO ITEMS IN STAGING TABLES
-- case 3: data in table
INSERT INTO PS_MASTER_ITEM_EC VALUES ('abc')
-- output: abc
Si votre question est juste Une requête SQL est composée de différentes parties appelées "clauses". Tout ce que vous écrivez dans la clause Il y a une exception si vous omettez si vous omettez la clause Sélectionnez code> et
à partir de code> en sont deux de ces (probablement les plus importants). P>
SELECT CODE> (c'est-à-dire après
SELECT CODE> et avant que
de code>) ne peut produire que colonnes forte> des lignes résultant de ce que vous écrivez dans le
de clause. La table
ps_master_item_ec code> dans votre clause code> de la clause code> ne contient pas de lignes, votre
de la clause code> ne peut produire aucune ligne de lignes. Par conséquent, la clause
SELECT code> n'a pas de lignes qu'il peut créer des colonnes pour. P>
de code>,
Sélectionnez CODE>
SELECT 'no result found' as Dummy
-- Will generate a result with one row, one column "Dummy" containing 'no result found'
Si la table est vide, la requête ne renvoie aucune ligne de rangée. Le cas code> code> expression b> (non "instruction") n'est pas évalué.
Si la table a 0 lignes, alors ce qui précède
SELECT CODE> ne retournera rien. Un cas code> code> ne peut renvoyer aucune ligne, s'il y a pas de lignes i>. La seule instruction SQL simple qui renvoie un ensemble de résultats, lorsqu'il n'y a pas de lignes, est un
Nombre code> sans groupe
par code>. Par exemple,
Sélectionnez Count (*) à partir de Sys.Tables où [Nom] = N'IF Vous avez une table appelée ceci, vous êtes stupide! '; Code>
@Larnu alors puis-je utiliser
compteur * code> avec un cas code> instruction code> ou comment puis-je accomplir la chaîne de texte s'il n'y a pas de lignes non présentes?
cas code> expression b>; SQL Server n'a aucun support pour
case code> (
commutateur code>).
Et vous devrez vous faire plus de détails pour répondre à votre question, telle que ce que vous attendez quand il y a plusieurs rangées.
S'il y a un inv_Item_id (il y aura toujours s'il y a une ligne présente) alors je veux juste retourner cet inv_Item_id. La seule fois que je souhaite retourner la chaîne de texte ci-dessus est s'il n'y a pas de lignes Inv_Item_ID / Pas de lignes dans la table.
Je pense que l'utilisation de
code> avec
existe code> comme ci-dessous fonctionnera bien pour moi:
Sélectionnez cas lorsqu'il existe (sélectionnez 1 à partir de ps_master_item_ec), alors "Nous avons des enregistrements de ce client" Sinon 'nous n'avons pas de disques pour ce client' fin de «résultat» code>
Non, cela ne fonctionnera toujours pas, je veux qu'il renvoie les valeurs inv_Item_id s'il existe une / une ligne existante. C'est seulement quand il n'y a pas de nef_item_id / aucune ligne de rangée présente, je veux qu'il retourne la chaîne de texte.
Vous devrez gérer cela dans votre requête de jointure de gauche, vous ne fonctionnerez tout simplement pas comme vous vous attendez à votre requête - à moins que vous n'ayez que ec.inv_item_id = '', alors que vous obtiendrez ce texte. D'autre part, si vous faites une joindre à gauche, vous seriez capable de faire quelque chose comme "Sélectionnez <..> (cas où ec.inv_item_id n'est pas NULL, alors ec.inv_item_id sinon 'Aucun article dans la fin des tables de stadification) comme Inv_Item_ID à partir de quelque sièretable ST Gauche Joignez PS_MASTER_ITEM_EC EC sur ST.Somefield = EC.Somefield "