精华内容
下载资源
问答
  • 展开全部不同的数636f70793231313335323631343130323136353331333337613861...如果是SQLServer数据库,存储过程的if, else语句可以这样写:ifa>bBeginprint'a'EndElseifaBeginprint'b'EndElseBeginprint'代码'End...

    展开全部

    不同的数636f70793231313335323631343130323136353331333337613861据库中,存储过程中if else 语句写法有一些差别。

    如果是SQLServer数据库,存储过程的if, else语句可以这样写:if a>b

    Begin

    print 'a'

    End

    Else if a

    Begin

    print 'b'

    End

    Else

    Begin

    print '代码'

    End

    Oracle 采用下面这种写法:IF testvalue > 100 THEN

    dbms_output.put_line( '100+' );

    ELSIF testvalue = 100 THEN

    dbms_output.put_line( '100' );

    ELSE

    dbms_output.put_line( '100-' );

    END IF;

    DB2,  MYSQL  是下面这种写法:  ( 与 Oracle 区别在于那个    ELSIF   )IF p_val > 100 THEN

    INSERT INTO output_debug VALUES( '100+' );

    ELSEIF p_val = 100 THEN

    INSERT INTO output_debug VALUES( '100' );

    ELSE

    INSERT INTO output_debug VALUES( '100-' );

    END IF;

    展开全文
  • 的IF语法不正确.它应该是:delimiter ;;create procedure SP_Insert(in MatchIDP int,in TipID int, in User int)beginif exists(select * from betslips where MatchID = MatchIDP and UserID = User) thenupdate...

    您的IF语法不正确.它应该是:

    delimiter ;;

    create procedure SP_Insert(in MatchIDP int,in TipID int, in User int)

    begin

    if exists(

    select * from betslips where MatchID = MatchIDP and UserID = User

    ) then

    update Betslips set TipID = 2; -- where ?

    else

    insert into Betslips (MatchID,TipID , UserID) values (MatchIDP, TipID, User);

    end if;

    end;;

    但是,如果您永远不会允许Betslips中的重复(MatchID,UserID)条目,为什么不在这些列之间定义UNIQUE约束,然后使用INSERT ... ON DUPLICATE KEY UPDATE:

    ALTER TABLE Betslips ADD UNIQUE INDEX (MatchID, UserID);

    INSERT INTO Betslips (MatchID, TipID, UserID) VALUES (?, ?, ?)

    ON DUPLICATE KEY UPDATE TipID = 2;

    展开全文
  • 为了解决这个问题,用到了存储过程的If Else,下面是完整的存储过程。 代码示例: 代码如下:create PROCEDURE [dbo].[P_Form_Control_Info_Add] @TypeName varchar(20), @Description varchar(50), @CtlColSpan ...
  • 总忘记mysql存储过程的语法,然后百度出来的答案总写不全,自己写个例子...IF ((b_type IS NOT NULL) AND (c_type IS NOT NULL)) THENIF (b_type =c_type) THENSELECT 1;-- 一定得写一句话,不知道有没有类似于...

    总忘记mysql存储过程的语法,

    然后百度出来的答案总写不全,

    自己写个例子...

    IF ((b_type IS NOT NULL) AND (c_type IS NOT NULL)) THEN

    IF (b_type =c_type) THEN

    SELECT 1;-- 一定得写一句话,不知道有没有类似于python中的pass

    ELSEIF (b_type !=c_type) THEN

    IF (c_type = 1) THEN

    SELECT 3;

    END IF;

    END IF;

    END IF;

    想起之前建军大爷总让我在if的条件里面写成Null != xxx,说是万一xxx妹汁的时候可以避免错误。

    但目前的编程语言都没遇到过必须写成这样的情况。可能是c或者c++里面的习惯?

    DELIMITER $$

    USE `zeus`$$

    DROP PROCEDURE IF EXISTS `inventory_cost`$$

    CREATE DEFINER=`zeusquery`@`%` PROCEDURE `inventory_cost`()

    BEGIN

    CREATE TABLE IF NOT EXISTS zeus_tmp.tmpPro_inventory_cost LIKE zeus.inventory_cost;

    DELETE FROM zeus_tmp.tmpPro_inventory_cost;

    CREATE TABLE IF NOT EXISTS zeus_tmp.tmpDistinct_inventory_cost(

    `org_id` DOUBLE ,

    `warehouse_id` DOUBLE ,

    `item_id` DOUBLE

    );

    DELETE FROM zeus_tmp.tmpDistinct_inventory_cost;

    INSERT INTO zeus_tmp.tmpDistinct_inventory_cost

    SELECT DISTINCT org_id,warehouse_id, item_id FROM zeus_tmp.tmp_inventory_cost;

    BEGIN

    DECLARE b_org_id INT(11);

    DECLARE b_warehouse_id INT(11);

    DECLARE b_item_id INT(11);

    DECLARE ws_done INT(11) DEFAULT 0;

    DECLARE ws CURSOR FOR SELECT DISTINCT org_id ,warehouse_id,item_id FROM zeus_tmp.tmpDistinct_inventory_cost;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET ws_done = 1;

    OPEN ws;

    loop1:LOOP

    IF ws_done = 1 OR cal_flag=length_tmp_inventory_cost THEN

    LEAVE loop1 ;

    END IF ;

    FETCH NEXT FROM ws INTO b_org_id ,b_warehouse_id, b_item_id;

    END LOOP loop1;

    CLOSE ws;

    END;

    END$$

    DELIMITER ;

    展开全文
  • 面对过多的if-else,代码可能看起来比较冗余,搞不好又是一张被人到处转发的“我们项目几百几千行if”的图。但是经过各种设计模式和封装,if大大减少,但可读性可能稍微降低了,而且比较抽象。那我们应该如何取舍呢...

    面对过多的if-else,代码可能看起来比较冗余,搞不好又是一张被人到处转发的“我们项目几百几千行if”的图。但是经过各种设计模式和封装,if大大减少,但可读性可能稍微降低了,而且比较抽象。那我们应该如何取舍呢

    抛开其他因素,如果if-else过多,可读性也许会好也可能会降低,可维护性也是或高或低;如果if-else少,代码高度抽象,可读性会低或者不变,可维护性可能会高也可能会低。这里大概可能会有几种情况

    if平铺条件单一

    这种情况,if精简不精简,可读性是不会变的,但是精简程度和可维护性是正相关的。至于为什么,看一下代码就可以感受到了

    1a09914acfa0fc6babc22433ebd88946.png

    执行语句单一

    if (a === 1) {    console.log('this is 1')} else if  (a === 2) {    console.log('this is 2')} else if  (a === 3) {    console.log('this is 3')} // ...还有很多else {    console.log('this is other')}

    精简代码:

    // 如果上面的if a是从1到10console.log(`this is ${a > 0 && a < 10 ? a : 'other'}`)// 如果上面的if a是从1到5和从7-10if ((a > 0 && a < 5) || (a > 7 && a < 10) {    console.log(`this is ${a}`)} else {    console.log('this is other')}// a取值灵活区间const area = [[1,2], [5,7], [10, 11]]console.log(`${area.find(([from, to]) => {    return from <= a && a <= to}) ? a : 'other'}`)

    这种情况,有没有精简,可读性都没有发生变化,如果是未精简的,写一堆if,你还是很容易看得出干啥。而可维护性就不一样了,要加一个或者多个数字,那么就要深入到某个if分支,一个个动手改,维护性低。但是,如果精简了的话,维护性大大增加,代码也简短。只需要寻找if的规律并封装所有的case即可,最后做到“条件驱动”

    一些极简情况

    有一些非常简单的情况,可以使用&&、||、三元解决

    // beforeif (cb) {    cb()}//aftercb && cb()// beforeif (!obj) {    obj = {}}obj.a = 1//after(obj || obj = {}).a = 1// beforeif (type === true) {  value = 1} else {  value = 2}//aftervalue = type ? 1 : 2// beforeif (type === DEL) {  this.delateData(id)} else {  this.addData(id)}// afterthis[type === DEL ? 'delateData' : 'addData'](id)// or;(type === DEL ? this.delateData : this.addData)(id)// beforeif (a === 1 && a === 2 && a === 10) {    console.log('ok')}// afterif ([1, 2, 10].includes(a)) {    console.log('ok')}

    条件单一、执行语句单一的情况,建议优化指数:★★★★★

    执行语句复杂

    if (a === 1) {    console.log('this is 1')} else if  (a === 2) {    console.log('this is 二')} else if  (a === 3) {    console.log('this is three')} // ...还有很多else {    console.log('this is other')}

    精简代码:

    const map = {    1: 'this is 1',    2: 'this is 二',    3: 'this is three',    // ...很多}console.log(map[a] || 'this is other')

    这种情况,和执行语句单一类似,也是可读性不变,代码减少了可维护性只是略好一点。通常的解决办法就是k-v映射了。加一个条件,就在map中加多一对k-v(由于条件处理复杂,所以条件上没有优化空间了,必须写出来)

    这种场景,平时应该会比较常见转为switch。如果执行语句很复杂无规律,写k-v的缺陷就来了:一个key被迫对应一个callback函数,还会花时间斟酌传值问题,而且代码量也没发生变化,此时不建议优化

    if (a === 1) {    console.log('this is 1')    alert(a * 100);} else if  (a === 2) {    console.log('this is 二')    document.body.innerHTML = a + 1 + b}// afterconst map = {    1: (a) => {        console.log('this is 1')        alert(a * 100);    },    2: (a, b) => {        console.log('this is 二')        document.body.innerHTML = a + 1 + b    }}map[a](a, b) // 代码量并没有减少也没有增强维护性复制代码

    问题来了,条件单一,但处理语句有简单的也有复杂的怎么办?case by case,先归类再分情况,最终只会剩下少量if和switch的

    小结: 条件单一、执行语句复杂的情况,有规律时建议优化指数:★★★,无规律时,建议指数:★

    if平铺条件复杂

    如果条件复杂,执行语句单一,那么条件可以通过&&、||、三元来简化,或者是平铺if-return,问题也迎刃而解。然而,条件复杂,执行语句大概率也是复杂的。

    if (a === 1) {  console.log(1);} else if (arr.length === 3) {  alert('this is length 3 arr');} else if (a === 2 && b === 1) {  console.log(2);  console.info('haha');} else if (a === 2) {  console.log(222);  document.title = 'a = 2';} else if (arr.length) {  console.error('arr is not empty');}

    都没有规律可循,那么就真的没有进一步方案了。但是我们观察一下,发现一些条件是有交集的,如a === x,我们可以把这种类型的if抽出来:

    const handleA = {    1: () => {        console.log(1);    },    2: () => {        if (b === 1) {            console.log(2);            console.info('haha');        } else {            console.log(222);            document.title = 'a = 2';        }    }}const handleArrLen = {    3: () => {        alert('this is length 3 arr');    }}if (handleA[a]) {    handleA[a]()} else if (arr.length) {    ;(handleArrLen[arr.length] || () => {        console.log(222);        document.title = 'a = 2';    })()}

    这样子,可以把逻辑模块化,增加可读性和可维护性,但是牺牲了精简性。

    注意,上面这样子条件模块化了,意味着同一类的条件都会归到一起。如果业务逻辑对if条件有严格要求的,比如一定要先判断a === 1,再看看arr.length === 3,再看a === 2 && b === 1,按照这样的顺序,那就不能这样做了

    还有一种情况,就是if里面直接调用已经封装好的函数,没有其他语句(其实就相当于退化为条件复杂,执行语句简单了):

    if (a === 1) {  f1()} else if (arr.length === 3) {  f2()} else if (a === 2 && b === 1) {  f3()} else if (a === 2) {  f4()} else if (arr.length) {  f5()}

    这种情况(前提条件,不会经常改这里,如果是经常改,还是会吐血的),减少if后也不赖:

    const index = [a === 1, arr.length === 3, a === 2 && b === 1, a === 2, arr.length].findIndex(Boolean)if (index !== -1) {  [f1, f2, f3, f4, f5][index]()}

    如果所有的else if都是互斥的,没有交集,那么换成if-return更好

    if (a) {    // do xx about a    return}if (b) {    // do xx about b    return}

    小结:如果条件复杂,执行语句单一,建议优化指数: ★★★★★;如果执行语句也复杂,当条件可以模块化的且没有顺序要求,建议优化指数: ★★★★。当条件有严格顺序要求、无规律可循,不建议强行减少if-else

    if条件有嵌套

    嵌套实际上就是平铺的增强,平铺嵌套平铺,我们可以当作是多个if平铺条件复杂的情况来看。例如有如下代码,我们寻找一些规律来优化一下

      if (id === 1) {    console.log(1);    if (type === 2) {      console.log('type2');    } else {      console.log('type3');    }  } else if (id === 2) {    console.log(2);    if (type === 3) {      console.log('id2 type3');      if (ext === 1) {        console.log('ext1');      }    }  } else {    console.log('other id');  }

    根据id划分:牺牲了其他因素的可读性,但对于id的维护性增强了

    const handleId = {    1: () => {        console.log(1)        console.log(type === 2 ? 'type2' : 'type3')    },    2: () => {        console.log(2)        // 这里建议优化指数为★★,可能可读性低,所以保持现状也行        // eslint一开,这套凉凉,必须写回普通if-else        type === 3 && (console.log('id2 type3'), ext === 1) && console.log('ext1')    }}handleId[type] ? handleId[type]() : console.log('other id')

    如果此时根据type划分,那么难度大大增加了,这就是人人惧怕的重构了。如果后面业务逻辑,的确是以type为主导的,那重构也是早晚的事情了。所以,前期的设计以及产品逻辑,将会决定后面的维护舒服不舒服了

    小结: if条件有嵌套情况,拆分if,其实就是平铺的if嵌套平铺的if,如果有规律可循,那么按照前面的平铺来减少if。如果没有规律、也不是逻辑侧重的点,那么就不建议减少if了

    总结

    • 条件简单,执行语句单一,强烈建议减少if-else来优化,用条件驱动结果(&& ||三元或者是自己写小逻辑)
    • 条件简单,执行语句复杂,可保持现状或者换成switch,如果不复杂可以使用map映射
    • 条件复杂,执行语句单一,强烈建议减少if-else来优化;如果执行语句也复杂,当条件可以模块化的且没有顺序要求,比较建议优化。当条件有严格顺序要求、无规律可循,不建议任何改动
    • 嵌套if,拆分为平铺if来判断如何优化或者不改动


    作者:lhyt
    链接:https://juejin.im/post/5e86a0e56fb9a03c4a4966fb

    展开全文
  • 数据库中有两张表,A表主键为自动增长的并且是B表的外键且...为了解决这个为题最后考虑用存储过程的If Else最方便,具体的存储过程如下 create PROCEDURE [dbo].[P_Form_Control_Info_Add] @TypeName varchar(20),
  • 存储过程的ifelse怎幺写?Oracle 是下面这种写法:IF testvalue > 100 THENdbms_output.put_line( '100+' );ELSIF testvalue = 100 THENdbms_output.put_line( '100' );ELSEdbms_output.put_line( '100-' );END ...
  • drop procedure if exists p_hello_world; create procedure p_hello_world(in v_id int) begin if (v_id > 0) then select '> 0'; elseif (v_id = 0) then select '= 0'; else
  • 这是我添加一个存储过程,就是判断商品表 shch_product表是不是空,如果为空将data_tijianbiao信息全部插入到商品表中,如果不为空表,则将商品表中没有,但是data_tijianbiao中有信息加入到商品表中,为什么...
  • 如果是SQLServer数据库,存储过程的if, else语句可以这样写: 1 2 3 4 5 6 7 8 9 10 11 12 if?a>b Begin ???print?'a' End Else?if?a<b Begin ???print?'b' End Else Begin ????print?...
  • create or replace procedure pro_common_callback( srctablename in varchar2, desttablename in varchar2, ...if desttablename='T_LS_CHECK_QULIFICATION' then begin v_select_sql:='insert into T_LS_C
  • SQL Server 存储过程if else细节 写一个简单的存储过程,简单逻辑,简单语句,如下 IF @TYPE = '1' BEGIN组 。。。(查询语句) END IF @TYPE = '2' BEGIN 。。。(查询语句) END ELSE BEGIN 。。。(查询...
  • 原题如下:题目这题看着不是很难,刚开始简单实现了一下,用了很多的if ~ else,感觉不太好。百度了一下,发现jdk1.8的lambda表达式,提供了Supplier这个函数成功解决了这个问题。看一下代码://判断三角形形状class...
  • 含有if else的存储过程

    2014-10-27 17:19:01
    if abs(mtime - cursor_result.arrivel_time) > 3 then dbms_output.put_line('---如果不是72小时回诊内 不插入---'); else insert into temp values (cursor_result.names); end if; insert into temp ...
  • 用法 if ... then ... elsif ... then ... else ... end if; if ... then  ... else ... end if; if ... then ... end if; ...
  • oracle-存储过程-if_else

    2020-11-26 17:41:35
    PROCEDURE "if_else" AS -- 查询出 150号员工工资,若其工资大于或等于10000则打印 'salary>=10000'; -- 若在5000 到 10000之间,则打印'5000<=salary<10000';否则打印'salary<5000' /* -- 关于这...
  • 类似语法上问题,其实可以参考一下手册中说明和例子。... IF StatementIF search_condition THEN statement_list[ELSEIF search_condition THEN statement_list] ...[ELSE statement_list]END IFIF impleme...
  • ELSE UPDATE payroll SET pay = pay+bonus WHERE empno=emp_id; END IF; EXCEPTION -- exception-handling part starts here WHEN comm_missing THEN ... END award_bonus;    
  • MySQL IF ELSEIF ELSE基于多个表达式执行语句。其语法如下-IFexpressionTHENstatements;ELSEIFelseif-expressionTHENelseif-statements;...为了演示IF ELSEIF ELSE语句在MySQL存储过程使用,我们基于以下名...
  • 及时获取有趣有料技术文章前言if...else 是所有高级编程语言都有必备功能。但现实中代码往往存在着过多 if...else。虽然 if...else 是必须,但滥用 if...else 会对代码可读性、可维护性造成很大伤害,...
  • BEGIN select count(id) from tlk_A if(count(id)>0){ select * from tlk_B }else{ ... select * from tlk_C ...我要在存储过程里面写类似上面逻辑代码,不知道该怎么写,sql基础不太好
  • 语法: if 条件 begin 执行操作 end else begin 执行操作 end 二:while 语法:while 条件 begin 执行操作 end 实例: USE [OABusiness] GO /****** 对象: StoredProcedure [dbo].[inertdate] 脚本...
  • 终极手撕之架构大全:分布式+框架+微服务+性能...但是在实际开发中,往往不是简单 if-else 结构,我们通常会不经意间写下如下代码:-------------------- 理想中 if-else --------------------public void today()...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,268
精华内容 507
关键字:

else存储过程的if