web-dev-qa-db-fra.com

Utilisation de l'instruction IF ELSE basée sur Count pour exécuter différentes instructions Insert

Pendant la recherche dans ma base de données, j'exécute une instruction INSERT si un élément particulier n'existe pas et une autre instruction INSERT si je trouve un ou plusieurs de ces éléments.

Je ne sais pas trop comment utiliser les expressions IF ELSE.

Ce que j’ai jusqu’à présent est une déclaration qui comptera le nombre de fois où les données cibles apparaissent; il affichera VRAI s'il est supérieur à 0, sinon, il affichera FAUX. Je ne trouve aucun exemple pour m'aider à comprendre comment l'utiliser pour exécuter deux instructions INSERT différentes.

Voici ce que j'ai jusqu'à présent:

SELECT CASE WHEN COUNT(*)>0 THEN 'TRUE' ELSE 'FALSE' END
(
  SELECT [Some Column], COUNT(*) TotalCount
  FROM INCIDENTS
  WHERE [Some Column] = 'Target Data'
  GROUP BY [Some Column]
)
47
user1934821

En fonction de vos besoins, voici deux manières:

IF EXISTS (SELECT * FROM TABLE WHERE COLUMN = 'SOME VALUE')
    --INSERT SOMETHING
ELSE
    --INSERT SOMETHING ELSE

Ou un peu plus longtemps

DECLARE @retVal int

SELECT @retVal = COUNT(*) 
FROM TABLE
WHERE COLUMN = 'Some Value'

IF (@retVal > 0)
BEGIN
    --INSERT SOMETHING
END
ELSE
BEGIN
    --INSERT SOMETHING ELSE
END 
89
sgeddes

Tant que vous avez besoin de le trouver basé sur Comptez un peu plus que 0, il est préférable d'utiliser EXISTS comme ceci:

IF EXISTS (SELECT 1 FROM INCIDENTS  WHERE [Some Column] = 'Target Data')
BEGIN
    -- TRUE Procedure
END
ELSE BEGIN
    -- FALSE Procedure
END
6
Atheer Mostafa

IF exists

IF exists (select * from table_1 where col1 = 'value')
BEGIN
    -- one or more
    insert into table_1 (col1) values ('valueB')
END
ELSE
    -- zero
    insert into table_1 (col1) values ('value') 
3
paparazzo

Pas très clair ce que vous entendez par 

"I cant find any examples to help me understand how I can use this to run 2 different statements:"

. Utilisez-vous CASE comme une SWITCH que vous recherchez? 

select case when totalCount >= 0 and totalCount < 11 then '0-10'
            when tatalCount > 10 and totalCount < 101 then '10-100'
            else '>100' end as newColumn
from (
  SELECT [Some Column], COUNT(*) TotalCount
  FROM INCIDENTS
  WHERE [Some Column] = 'Target Data'
  GROUP BY [Some Column]
) A
2
Kaf

Il y a beaucoup, beaucoup de façons de coder cela, mais voici une façon possible. Je suppose que MS SQL

Nous commencerons par obtenir le nombre de lignes (Another Quick Exemple ), puis nous ferons if/else

-- Let's get our row count and assign it to a var that will be used
--    in our if stmt 
DECLARE @HasExistingRows int -- I'm assuming it can fit into an int
SELECT @HasExistingRows = Count(*) 
   ELSE 0 -- false
FROM
   INCIDENTS
WHERE {Your Criteria}
GROUP BY {Required Grouping}

Maintenant, nous pouvons faire le If/Else Logic MSDN Docs

-- IF / Else / Begin / END Syntax
IF @HasExistingRows = 0 -- No Existing Rows
   BEGIN
      {Insert Logic for No Existing Rows}
   END
ELSE -- existing rows are found
   BEGIN
      {Insert logic for existing rows}
   END

Un autre moyen plus rapide (inspiré par le commentaire de Mahmoud Gamal):

Oubliez toute la création/affectation de variable - recherchez "EXISTS" - MSDN Docs 2 .

IF EXISTS ({SELECT Query})
   BEGIN
      {INSERT Version 1}
   END
ELSE
   BEGIN
      {INSERT version 2}
   END
1
Ray K

une solution évidente consiste à exécuter 2 requêtes distinctes, sélectionnez d’abord tous les éléments dont le nombre est égal à 1 et exécutez votre insertion, puis sélectionnez les éléments dont le nombre est supérieur à 1 et exécutez la deuxième insertion.

dans un deuxième temps, si les deux insertions sont similaires, vous pouvez probablement les combiner en une requête.

une autre possibilité consiste à utiliser un curseur pour parcourir votre jeu d'enregistrements et à effectuer la logique dont vous avez besoin pour chaque ligne.

1
Zdravko Danev

Utilisez simplement les éléments suivants:

IF ((nombre de sélections (*) de la table) = 0)

....

FIN

0
Katie

Si c'est dans SQL Server, votre syntaxe est correcte; Cependant, vous devez référencer le compte (*) en tant que nombre total à partir de votre requête imbriquée. Cela devrait vous donner ce dont vous avez besoin:

SELECT CASE WHEN TotalCount >0 THEN 'TRUE' ELSE 'FALSE' END FROM
(
  SELECT [Some Column], COUNT(*) TotalCount
  FROM INCIDENTS
  WHERE [Some Column] = 'Target Data'
  GROUP BY [Some Column]
) DerivedTable

En utilisant cela, vous pouvez affecter TotalCount à une variable, puis utiliser une instruction IF ELSE pour exécuter vos instructions INSERT:

DECLARE @TotalCount int
SELECT @TotalCount = TotalCount FROM
(
  SELECT [Some Column], COUNT(*) TotalCount
  FROM INCIDENTS
  WHERE [Some Column] = 'Target Data'
  GROUP BY [Some Column]
) DerivedTable
IF @TotalCount > 0
    -- INSERT STATEMENT 1 GOES HERE
ELSE
    -- INSERT STATEMENT 2 GOES HERE
0
Jeff