如果使用其他情况返回值

时间:2019-01-18 09:29:53

标签: sql sql-server

我正在尝试使用CASE进行if else语句。如果没有记录,请先使其依次为0+1。否则,只获取最后一条记录,然后+1。最初尝试使用ISNULL(statement,0)。但它没有其他声明。

然后,我在StackOverflow上看到了许多其他案例案例的示例,但我似乎并不了解如何实现

INSERT INTO TICKET_SALES (
    TRXDATE, 
    KIOSKID, 
    BOOKINGREFERENCENUM, 
)
VALUES (
    '2019-01-18 16:59:29',
    'KIOSK1',
    ((SELECT TOP 1 BOOKINGREFERENCENUM FROM TICKET_SALES ORDER BY BOOKINGREFERENCENUM DESC)+1),
);

3 个答案:

答案 0 :(得分:1)

只需使用Idetitity(1, 1)创建表:

CREATE table TicketSales
(
       TrxDate DATETIME
    ,  KioskId INT
    , BookingReferenceNum int IDENTITY(1,1)
)

As MSDN says:

  

Identity列可用于生成键值。身份   列上的属性可确保满足以下条件:

     
      
  • 每个新值都是基于当前种子和增量生成的。

  •   
  • 特定交易的每个新价值都与其他交易不同   并发事务在表上。

  •   
  • 列上的identity属性不能保证满足以下条件:

  •   
  • 值的唯一性-必须使用   PRIMARY KEY或UNIQUE约束或UNIQUE索引。

  •   
     

... to further read

答案 1 :(得分:1)

如果您需要使用表达式来提供值,则可以将VALUES的{​​{1}}更改为SELECT,尽管您只能使用SELECT提供1行(除非您使用{{ 1}})。

UNION ALL

请谨防使用这种类型的“技巧”来生成ID,正如其他人指出的那样,这是一个非常不好的主意(请查看StepUp的答案以了解如何更正)。

答案 2 :(得分:0)

IMO最简单的方法是声明变量以保存所需的值,以易于理解的方式为其分配值,然后在INSERT语句中使用它。

此外,无需使用命令TOP 1即可,只需使用MAX函数:)

DECLARE @id INT;
SELECT @id = CASE COUNT(*) WHEN 0 THEN 0 ELSE MAX(BOOKINGREFERENCENUM) + 1 END
FROM MyTable;

INSERT INTO TICKET_SALES (
    TRXDATE, 
    KIOSKID, 
    BOOKINGREFERENCENUM, 
)
VALUES (
    '2019-01-18 16:59:29',
    'KIOSK1',
    @id
);

注意:您正在重新发明轮子,SQL具有类似IDENTITY之类的东西,对这种任务很有用。