0
votes

Comment textuellement indiquer qu'il n'y a aucun résultat dans une sélection de SQL?

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


9 commentaires

Si la table est vide, la requête ne renvoie aucune ligne de rangée. Le cas expression (non "instruction") n'est pas évalué.


Si la table a 0 lignes, alors ce qui précède SELECT ne retournera rien. Un cas ne peut renvoyer aucune ligne, s'il y a pas de lignes . La seule instruction SQL simple qui renvoie un ensemble de résultats, lorsqu'il n'y a pas de lignes, est un Nombre sans groupe par . Par exemple, Sélectionnez Count (*) à partir de Sys.Tables où [Nom] = N'IF Vous avez une table appelée ceci, vous êtes stupide! ';


@Larnu alors puis-je utiliser compteur * avec un cas instruction ou comment puis-je accomplir la chaîne de texte s'il n'y a pas de lignes non présentes?


cas expression ; SQL Server n'a aucun support pour case ( commutateur ).


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 avec existe 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»


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 "


8 Réponses :


0
votes

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, j'encouragerais Vous penser à la vérification de cette condition au consommateur, car les requêtes de base de données sont mieux adaptées pour l'insertion / la mise à jour / la suppression et l'obtention de données forte>.

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 


0 commentaires

1
votes
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

0 commentaires

0
votes

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 Union code> pour ajouter une nouvelle ligne au jeu de résultats uniquement lorsque ps_master_item_ec code> est vide. P>

Ainsi, vous pouvez simplement répertorier tous vos enregistrements S'il y en a, et montrez votre message lorsque 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 )


0 commentaires

0
votes

Toutes les valeurs d'une colonne doivent avoir le même type de données. Donc, si la colonne 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.

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>

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;


2 commentaires

Un n'existe pas 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)


D'accord, merci - j'ai modifié la réponse en conséquence. (Effectivement nécessaire pour omettre la clause à partir de car elle ne provoque aucune ligne à présenter.)



0
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

Il pourrait être obtenu en utilisant rejoindre gauche code>: xxx pré>

DB FIDDLE Démo strong> P>


Scénarios: P>

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


0 commentaires

0
votes

Si votre question est juste pourquoi forte> vous n'obtenez aucun résultat, voici ma réponse à celle-là:

Une requête SQL est composée de différentes parties appelées "clauses". Sélectionnez code> et à partir de code> en sont deux de ces (probablement les plus importants). P>

Tout ce que vous écrivez dans la clause 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>

Il y a une exception si vous omettez si vous omettez la clause de code>, Sélectionnez CODE> CAN FORT> Produire un résultat avec une seule ligne comme dans P>

SELECT 'no result found' as Dummy
-- Will generate a result with one row, one column "Dummy" containing 'no result found'


0 commentaires