如果否则使用大小写返回值



我正在尝试使用 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),
);

如果需要使用表达式来提供值,则可以更改SELECTVALUES,尽管您只能提供 1 行SELECT(除非您使用 UNION ALL )。

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

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

只需创建带有Idetitity(1, 1)表:

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

正如MSDN所说:

标识列可用于生成键值。身份 列上的属性保证以下内容:

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

  • 特定事务的每个新值都不同于其他值 表上的并发事务。

  • 列上的标识属性不保证以下内容:

  • 值的唯一性 - 必须通过使用 主键或唯一约束或唯一索引。

。进一步阅读

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的东西,它对这种任务有好处。

最新更新