【问题标题】:Using IF ELSE statement based on Count to execute different Insert statements使用基于Count的IF ELSE语句执行不同的Insert语句
【发布时间】:2012-12-13 20:58:42
【问题描述】:

当我在我的数据库中搜索时,如果我发现某个特定项目不存在,我会运行一个 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]
)

【问题讨论】:

  • 您需要运行的插入语句有何不同?
  • 我假设他使用的是SQL Server,因为查询中使用了括号。
  • 好的,感谢您的快速回复。数据库是 MSSQLSERVER 2008 R2
  • 您可能需要查看EXISTS,它可能对您的情况有所帮助。
  • 只需要过滤计数大于0的结果吗?

标签: sql sql-server sql-server-2008 tsql sql-server-2008-r2


【解决方案1】:

根据您的需要,这里有几种方法:

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 

【讨论】:

  • 非常感谢!这正是我要找的!一个非常简单而优雅的解决方案!
  • 抱歉,我说得对,这两种解决方案都只能在程序中运行,而不是普通的 dml(如插入或类似)?
【解决方案2】:

只要你需要根据 Count 刚好大于 0 来查找,最好这样使用 EXISTS:

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

【讨论】:

    【解决方案3】:

    只需使用以下内容:

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

    【讨论】:

      【解决方案4】:

      如果存在

      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') 
      

      【讨论】:

        【解决方案5】:

        不太清楚你的意思

        "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
        

        【讨论】:

          【解决方案6】:

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

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

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

          【讨论】:

          • 非常感谢您的意见,但在这种情况下不适合 2 个单独的查询。
          【解决方案7】:

          编码的方法有很多很多,但这里有一种可能的方法。我假设是 MS SQL

          我们将从获取行数开始(另一个 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 逻辑 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
          

          【讨论】:

          • Mahmoud Gamal 在他的评论中提出了另一种很棒(更好)的方式:如果存在 - 这样您就不必为现有行创建变量,您可以将其直接用于您的 IF stmt。
          【解决方案8】:

          如果这是在 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
          

          【讨论】:

          • 嗨,杰夫,我不完全确定您所说的“将 COUNT(*) 引用为嵌套查询中的总计数”是什么意思,这无法正确解析
          • 您有一个嵌套查询,它选择 COUNT(*) 并为其分配 TotalCount 列。那是一个派生表。查看我的最新更新,看看是否适合您。
          猜你喜欢
          • 1970-01-01
          • 2021-06-17
          • 2013-03-13
          • 1970-01-01
          • 1970-01-01
          • 2020-09-06
          • 1970-01-01
          • 2020-03-20
          • 1970-01-01
          相关资源
          最近更新 更多