Sql 使用基于计数的IF-ELSE语句执行不同的Insert语句
在搜索数据库时,如果发现某个特定项不存在,则运行INSERT语句;如果找到该项的一个或多个,则运行其他INSERT语句 我不完全确定如何使用IF-ELSE表达式 到目前为止,我得到的是一条语句,它将计算目标数据出现的次数;如果大于0,则打印为真;如果不大于0,则打印为假。我找不到任何示例来帮助我理解如何使用它来运行两个不同的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 (
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