web-dev-qa-db-ja.com

Countに基づくIF ELSEステートメントを使用して、さまざまなInsertステートメントを実行する

データベースを検索しているときに、特定のアイテムが存在しないことがわかった場合はINSERTステートメントを実行し、このアイテムが1つ以上見つかった場合は別のINSERTステートメントを実行します。

IF ELSE式の使用方法が完全にはわかりません。

これまでのところ、ターゲットデータが表示される回数をカウントするステートメントがあります。 0より大きい場合はTRUEを出力し、そうでない場合はFALSEを出力します。これを使用して2つの異なるINSERTステートメントを実行する方法を理解するのに役立つ例を見つけることができません。

ここに私がこれまでに持っているものがあります:

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]
)
53
user1934821

ニーズに応じて、次の2つの方法があります。

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

またはもう少し

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 
97
sgeddes

0を超えるCountに基づいて検索する必要がある限り、次のようにEXISTSを使用することをお勧めします。

IF EXISTS (SELECT 1 FROM INCIDENTS  WHERE [Some Column] = 'Target Data')
BEGIN
    -- TRUE Procedure
END
ELSE BEGIN
    -- FALSE Procedure
END
7
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

あなたが何を意味するかはあまり明確ではありません

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

CASEのようなSWITCHを使用していますか?

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

これをコーディングする方法はたくさんありますが、ここに考えられる方法の1つがあります。私はMS SQLを想定しています

行数を取得することから始めます(別の 簡単な例 )、次に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}

これで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

別のより速い方法(マフムード・ガマルのコメントに触発された):

変数の作成/割り当て全体を忘れてください-"EXISTS"を参照してください- MSDN Docs 2

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

1つの明らかな解決策は、2つの個別のクエリを実行し、最初にcount = 1のすべてのアイテムを選択して挿入を実行し、次にcount> 1のアイテムを選択して2番目の挿入を実行することです。

2番目のステップとして、2つの挿入が類似している場合、おそらくそれらを1つのクエリに結合できます。

別の可能性は、カーソルを使用してレコードセットをループし、各行に必要なロジックを実行することです。

1
Zdravko Danev

以下を使用するだけです。

IF((SELECT count(*)FROM table)= 0)BEGIN

....

終わり

0
Katie

これがSQL Serverにある場合、構文は正しいです。ただし、ネストされたクエリの合計カウントとしてCOUNT(*)を参照する必要があります。これにより、必要なものが得られます。

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

これを使用して、TotalCountを変数に割り当て、IF ELSEステートメントを使用して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