【问题标题】:how can I use loop 'for' through a table in SQL to check if a column is 0?如何通过 SQL 中的表使用循环“for”来检查列是否为 0?
【发布时间】:2011-04-19 15:49:06
【问题描述】:

如何通过 SQL 中的表使用循环“for”来检查列是否为 0?

我需要在存储过程中这样做:

for  each record in  tablex
     if table.column1=0 then
         insert into table1;
     Else
         insert into table2;
 End for;

【问题讨论】:

  • SQL 是基于 SET 的。与过程/OO 代码不同,您通常不需要循环。

标签: sql mysql sql-server stored-procedures


【解决方案1】:

不用光标也可以做同样的事情:

INSERT INTO table1 (colA, colB) 
     SELECT valX, valy, 'const' 
       FROM Table 
      WHERE column1 = 0;

然后重复表 2。

【讨论】:

    【解决方案2】:

    尚不清楚您将使用哪种语言(MySQL 或 SQLServer)编写,但通常的方法是使用 DECLARE CURSOR、FETCH 和 WHILE。

    但是,如果任务像您在问题中所说的那样简单,那么更好、更快、更符合 SQL 的解决方案可能是:

    INSERT INTO Table1 (ColList) 
         SELECT ColList 
           FROM SourceTable 
          WHERE Column1 = 0;
    
    INSERT INTO Table2 (ColList) 
         SELECT ColList 
           FROM SourceTable 
          WHERE (Column1 <> 0 OR Column1 IS NULL);
    

    【讨论】:

    • 我知道游标,我想知道任何其他方式,我对任何(MYSQL / SQL SErver)感兴趣
    【解决方案3】:

    您是否有理由需要使用循环?你能不能不做

    insert into table1
    select * from tablex 
    where tablex.column1 = 0
    
    insert into table2
    select * from tablex 
    where tablex.column1 != 0
    

    【讨论】:

      【解决方案4】:

      你需要的是光标。

      mysql 的示例:

      DECLARE tmp INT;
      DECLARE cur1 CURSOR FOR SELECT column1 FROM `table`;
      OPEN cur1;
      
      read_loop: LOOP
          FETCH cur1 INTO tmp;
      
          -- perform your IF here
      END LOOP;
      
      CLOSE cur1;
      

      更多详情:http://dev.mysql.com/doc/refman/5.1/en/cursors.html

      SQL Server 的示例完全一样。

      SQL Server 详细信息:http://msdn.microsoft.com/en-us/library/ms180169.aspx

      【讨论】:

      • 与什么相比影响性能?如果你需要游标——你使用它们,如果你不需要——你不需要。它只是一个工具。您的问题听起来像“SELECT 会影响性能吗?”。
      • 游标解决方案 VS Larry & Nathan' 解决方案(插入选择)
      • 游标通常比基于集合的操作慢得多(例如许多人建议的 INSERT 解决方案)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2021-11-17
      • 2015-05-28
      • 2020-02-03
      • 2015-02-24
      • 1970-01-01
      • 2017-09-06
      相关资源
      最近更新 更多