我正在尝试使用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),
);
答案 0 :(得分:1)
只需使用Idetitity(1, 1)
创建表:
CREATE table TicketSales
(
TrxDate DATETIME
, KioskId INT
, BookingReferenceNum int IDENTITY(1,1)
)
Identity列可用于生成键值。身份 列上的属性可确保满足以下条件:
每个新值都是基于当前种子和增量生成的。
特定交易的每个新价值都与其他交易不同 并发事务在表上。
列上的identity属性不能保证满足以下条件:
值的唯一性-必须使用 PRIMARY KEY或UNIQUE约束或UNIQUE索引。
答案 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
之类的东西,对这种任务很有用。