Sql If-else用于返回值的用例
我正在尝试使用Sql If-else用于返回值的用例,sql,sql-server,Sql,Sql Server,我正在尝试使用CASE执行if-else语句。如果没有记录,则将其设置为0,然后设置为+1。否则,只需获取最后一条记录,然后+1。第一次尝试时,我使用了ISNULL(语句,0)。但它没有其他声明 然后,我看到了许多关于case语句的StackOverflow的其他示例,但我似乎不明白如何实现它 INSERT INTO TICKET_SALES ( TRXDATE, KIOSKID, BOOKINGREFERENCENUM, ) VALUES ( '2019-
CASE
执行if-else语句。如果没有记录,则将其设置为0
,然后设置为+1
。否则,只需获取最后一条记录,然后+1
。第一次尝试时,我使用了ISNULL(语句,0)
。但它没有其他声明
然后,我看到了许多关于case语句的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),
);
只需创建具有
理想性(1,1)
的表即可:
标识列可用于生成键值。身份
列上的属性可保证以下内容:
- 根据当前种子和增量生成每个新值
- 特定事务的每个新值都不同于其他值 表上的并发事务
- 列上的identity属性不能保证以下内容:
- 值的唯一性-必须使用 主键或唯一约束或唯一索引
只需创建具有
理想性(1,1)
的表即可:
标识列可用于生成键值。身份
列上的属性可保证以下内容:
- 根据当前种子和增量生成每个新值
- 特定事务的每个新值都不同于其他值 表上的并发事务
- 列上的identity属性不能保证以下内容:
- 值的唯一性-必须使用 主键或唯一约束或唯一索引
如果需要使用表达式来提供值,可以更改
选择
的值
,但只能提供一行选择
(除非使用联合所有
)
请注意使用这种类型的“技巧”来生成ID,正如其他人所指出的,这是一个非常糟糕的主意(检查Steppup的答案以了解如何更正)。如果需要使用表达式来提供值,可以更改
选择的值,尽管您只能提供一行选择(除非您使用联合所有)
请注意使用这种类型的“技巧”来生成ID,正如其他人所指出的,这是一个非常糟糕的想法(检查Steppup的答案以了解如何更正)。IMO最简单的方法是声明变量以保存所需的值,以易于阅读的方式为其赋值,然后在INSERT
语句中使用它
此外,无需在订购时使用TOP 1
,只需使用MAX
函数:)
注意:您正在重新发明轮子,SQL具有类似于标识的功能,它适合于此类任务。IMO最简单的方法是声明变量以保存所需的值,以易于阅读的方式为其赋值,然后在INSERT
语句中使用它
此外,无需在订购时使用TOP 1
,只需使用MAX
函数:)
注意:您正在重新发明轮子,SQL具有类似于IDENTITY
的功能,这对此类任务很有好处。要从查询中插入值,请使用insert。。选择而不是插入。。值
另外,不要使用MAX+1
作为ID。这会保证在删除行时重复和无效关系。你可以得到一个新的行,引用与旧的删除行相关的记录。如果使用这样的解决方案,它很容易受到竞争条件的影响;这可能意味着两行具有相同的ID。就个人而言,正如@jarlh所建议的,我将使用标识
;但是,to并不意味着您将拥有序列号。要从查询中插入值,请使用insert。。选择而不是插入。。值
另外,不要使用MAX+1
作为ID。这会保证在删除行时重复和无效关系。你可以得到一个新的行,引用与旧的删除行相关的记录。如果使用这样的解决方案,它很容易受到竞争条件的影响;这可能意味着两行具有相同的ID。就个人而言,正如@jarlh所建议的,我将使用标识
;然而,to并不意味着你将拥有序列号。lol。我怎么会错过1+isnull()的组合呢。仅供参考,我不需要这些值来创建ID,因为有许多行为null。因此,我只想增加,如果有任何现有的记录与预订参考号的具体条件在中国php@KIRPALSINGH那就要注意比赛情况了。如果并行运行此代码多次,则很可能会多次生成相同的BookingReferenceum
。您可以使用IDENTITY
列或创建SEQUENCE
来解决此问题,并检索其下一个值,前提是您认为有必要。如果其中任何一个对您有效,请务必接受作为答案。它将帮助其他人快速找到有效的解决方案@基尔帕辛格。我怎么会错过1+isnull()的组合呢。仅供参考,我不需要这些值来创建ID,因为有许多行为null。因此,我只想增加,如果有任何现有的记录与预订参考号的具体条件在中国php@KIRPALSINGH那就要注意比赛情况了。如果并行运行此代码多次,则很可能会多次生成相同的BookingReferenceum
。您可以使用IDENTITY
列或创建SEQUENCE
来解决此问题,并检索其下一个值,前提是您认为有必要。如果其中任何一个对您有效,请务必接受作为答案。它将帮助其他人快速找到有效的解决方案@谢谢,但你不明白我的问题。我不想在这里创建id。反正有人
CREATE table TicketSales
(
TrxDate DATETIME
, KioskId INT
, BookingReferenceNum int IDENTITY(1,1)
)
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)
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
);