【问题标题】:Multiple conditions without using multiple if else in SQL在 SQL 中不使用多个 if else 的多个条件
【发布时间】:2021-04-06 19:48:25
【问题描述】:

我必须用 SQL 编写一个有多个条件的程序,但我不应该用多个 if else 编写它(因为 if 的成本)。我是这个领域的新手,我不知道我还能怎么写它会更好 这是我的示例代码:

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME = 'Food_tbl')
BEGIN
    IF NOT EXISTS (SELECT TOP 1 FID FROM dbo.Food_tbl)
     BEGIN
        INSERT INTO dbo.Food_tbl
        SELECT *
        FROM DataFoodView                       
     END
    ELSE IF (SELECT COUNT(*) FROM dbo.Food_tbl)=20
     BEGIN
        PRINT N'Table Exists'
        SELECT *
        FROM Food_tbl
     END
    ELSE IF (SELECT COUNT(*) FROM dbo.FoodSara_tbl)<>20
     BEGIN
        print N'there isnt 20'
        INSERT INTO Food_tbl (Food_tbl.FID, Food_tbl.Fname, Food_tbl.Ftype, Food_tbl.Fcount, Food_tbl.Datetype, Food_tbl.Fdescription)
        SELECT DataFoodView.*
        FROM DataFoodView 
        LEFT JOIN FoodSara_tbl ON Food_tbl.FID = DataFoodView.FID
        WHERE Food_tbl.FID IS NULL;     
     END
END

PS:我首先检查表是否存在,如果没有任何记录,则插入所有数据,如果有 20 条记录则显示该表,如果该表没有 20 条记录,则查找丢失的数据然后插入。

【问题讨论】:

  • 考虑到涉及 2 个表,您将需要至少一个逻辑流操作。但是,如果表 Food_tbl 不存在,则上述操作将失败,无论您检查它,因为解析器将失败。如果Food_tbl 有可能不存在,则需要使用“动态”语句推迟编译。
  • 是什么让您认为没有 20 行(不是记录)的表与它是空的有根本的不同?在这两种情况下,您都可以插入“缺失数据”。此外,正如 Larnu 所说,如果表丢失,您将收到编译错误,运行时检查无法保护您免受此错误影响。
  • 为什么要故意复制数据?如果您担心成本、效率和正确性,那是您应该避免的一件事。同样奇怪的是,您有非常不同的插入语句 - 一个插入所有列,一个插入一组特定的列。不一致的代码不是一个好兆头。最后,一段代码通常应该有一个任务——它应该作为一个单元工作。您通常不会在 sql 中编写“程序”——您的目标不是很明确。

标签: sql sql-server if-statement multiple-conditions


【解决方案1】:

首先,不需要 ELSE 部分中的条件: 改变

ELSE IF (SELECT COUNT(*) FROM dbo.FoodSara_tbl)<>20
BEGIN

ELSE
BEGIN

接下来,您可以重新组合这两个 INSERT 部分,因为没有元素也有超过 20 个元素。

结果会是这样的:

IF EXISTS
(
    SELECT * FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME = 'Food_tbl'
)
BEGIN
    IF (SELECT COUNT(*) FROM dbo.Food_tbl)=20
    BEGIN
        PRINT N'Table Exists'
        SELECT *
        FROM Food_tbl
    END
    ELSE
    BEGIN
        print N'there isnt 20'
        INSERT INTO Food_tbl (Food_tbl.FID, Food_tbl.Fname, Food_tbl.Ftype, 
Food_tbl.Fcount, Food_tbl.Datetype, Food_tbl.Fdescription)
        SELECT DataFoodView.*
        FROM DataFoodView 
        LEFT JOIN FoodSara_tbl ON Food_tbl.FID = DataFoodView.FID
        WHERE Food_tbl.FID IS NULL;     
    END
END

【讨论】:

    【解决方案2】:

    从您提供的描述中无法理解确切的要求,但仅查看以下逻辑

    IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA= 'dbo' AND TABLE_NAME = 'Food_tbl')
    BEGIN
        DECLARE @RCount INT
        SELECT @RCount= COUNT(FID) FROM dbo.Food_tbl
        IF @RCount=0
         BEGIN
            //Your Logic 1 (for inserting data since no records found)                     
         END
        ELSE 
         BEGIN
            PRINT N'Table Exists'
            IF @RCount=20
            BEGIN
              //Your Logic 2 
            END
            ELSE
            BEGIN
              //Your Logic 3
            END
    
         END
       
    END 
    

    请详细解释要求或根据要求构建查询并添加代替逻辑1、2、3

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      相关资源
      最近更新 更多