Sql 使用基于计数的IF-ELSE语句执行不同的Insert语句

Sql 使用基于计数的IF-ELSE语句执行不同的Insert语句,sql,sql-server,sql-server-2008,tsql,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2008 R2,在搜索数据库时,如果发现某个特定项不存在,则运行INSERT语句;如果找到该项的一个或多个,则运行其他INSERT语句 我不完全确定如何使用IF-ELSE表达式 到目前为止,我得到的是一条语句,它将计算目标数据出现的次数;如果大于0,则打印为真;如果不大于0,则打印为假。我找不到任何示例来帮助我理解如何使用它来运行两个不同的INSERT语句 以下是我到目前为止的情况: SELECT CASE WHEN COUNT(*)>0 THEN 'TRUE' ELSE 'FALSE' END (

在搜索数据库时,如果发现某个特定项不存在,则运行INSERT语句;如果找到该项的一个或多个,则运行其他INSERT语句

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

到目前为止,我得到的是一条语句,它将计算目标数据出现的次数;如果大于0,则打印为真;如果不大于0,则打印为假。我找不到任何示例来帮助我理解如何使用它来运行两个不同的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中,那么您的语法是正确的;但是,您需要引用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=1的所有项目并运行insert,然后选择count>1的项目并运行第二个insert

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


另一种可能是使用光标在记录集中循环,并对每一行执行所需的任何逻辑。

不太清楚您的意思

我找不到任何例子来帮助我理解如何使用它来 运行2个不同的语句:

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
。它的使用情况是否像您所追求的开关

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

只要您需要根据大于0的计数来查找它,最好使用这样的EXISTS:

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

有很多很多方法可以编写代码,但这里有一种可能的方法。我假设是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逻辑

受马哈茂德·贾马尔评论启发的另一种更快的方式:

忘记整个变量创建/赋值-查找存在-


根据您的需要,以下是几种方法:

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 
如果存在

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

只需使用以下命令:

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

....

END

您需要运行的insert语句有多大不同?我假设他正在使用SQL Server,因为查询中使用了括号。好的,谢谢您的快速响应。数据库是MSSQLSERVER 2008 R2,您可能需要查看,它可能对您的情况有所帮助。您只需要筛选计数大于0的结果吗?嗨,Jeff,我不完全确定引用COUNT*作为嵌套查询的总计数是什么意思。这无法正确解析您有一个嵌套查询,它选择COUNT*并为其指定列TotalCount。这是一个派生表。查看我的上一次更新,看看这是否适用于您。Mahmoud Gamal在他的评论中提出了另一个更好的方法:if Exists-这样您就不必为现有行创建变量,您可以将其直接应用到if stmt中。非常感谢!这正是我要找的!一个非常简单和优雅的解决方案!对不起,伙计们,我说的对吗?这两个解决方案只能在过程中运行,而不是像insert或类似的普通dml?非常感谢您的输入,但是在这种情况下,两个单独的查询不适合。
IF((SELECT count(*) FROM table)=0)
BEGIN

....

END