63

当我在我的数据库中搜索时,如果我发现一个特定的项目不存在,我会运行一个 INSERT 语句,如果我找到一个或多个这个项目,我会运行一个不同的 INSERT 语句。

我不完全确定如何使用 IF ELSE 表达式。

到目前为止,我有一个语句,它将计算目标数据出现的次数;如果大于 0 则打印 TRUE,否则打印 FALSE。我找不到任何示例来帮助我理解如何使用它来运行两个不同的 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

只要你需要根据 Count 刚好超过 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:"

. 它是否CASESWITCH您所追求的那样使用?

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

一个明显的解决方案是运行 2 个单独的查询,首先选择所有 count=1 的项目并运行插入,然后选择 count>1 的项目并运行第二个插入。

作为第二步,如果两个插入相似,您可以将它们组合成一个查询。

另一种可能性是使用游标循环通过您的记录集并为每一行执行您需要的任何逻辑。

于 2012-12-28T16:02:24.553 回答
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

另一种更快的方法(灵感来自 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 回答