63

データベースを検索しているときに、特定のアイテムが存在しないことがわかった場合は 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]
)
4

8 に答える 8

128

ニーズに応じて、いくつかの方法があります。

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 
于 2012-12-28T16:12:12.760 に答える
12

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

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

....

END
于 2019-02-13T14:38:57.617 に答える
11

0 より大きいカウントに基づいて検索する必要がある限り、次のように EXISTS を使用することをお勧めします。

IF EXISTS (SELECT 1 FROM INCIDENTS  WHERE [Some Column] = 'Target Data')
BEGIN
    -- TRUE Procedure
END
ELSE BEGIN
    -- FALSE Procedure
END
于 2012-12-28T16:11:18.543 に答える
5

存在する場合

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') 
于 2012-12-28T16:21:46.020 に答える
2

意味がはっきりしない

"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
于 2012-12-28T16:07:14.593 に答える
1

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

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

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

于 2012-12-28T16:02:24.553 に答える
1

これをコーディングするには非常に多くの方法がありますが、ここでは可能な方法の 1 つを示します。私はMS SQLを想定しています

行数を取得することから始めて (Another Quick Example )、次に 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

別のより高速な方法 (Mahmoud Gamal のコメントに触発された):

変数の作成/割り当て全体を忘れてください-「EXISTS」を検索してください-MSDN Docs 2

IF EXISTS ({SELECT Query})
   BEGIN
      {INSERT Version 1}
   END
ELSE
   BEGIN
      {INSERT version 2}
   END
于 2012-12-28T16:12:09.863 に答える
0

これが 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
于 2012-12-28T16:01:31.740 に答える