我正在尝试使用 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),
);
如果需要使用表达式来提供值,则可以更改SELECT
的VALUES
,尽管您只能提供 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
的东西,它对这种任务有好处。