我正在尝试删除表客户中周期为每月(M)和每周(W)的记录。但是,使用下面的代码,不会删除任何数据。
我也尝试使用begin语句,但这仍然行不通。
我们可以使用@period IN吗?对我下面的代码有任何建议或帮助吗?
谢谢
DECLARE @Period CHAR(1)
IF @Period IN ('M','W')
BEGIN
IF EXISTS
(
SELECT TOP (1) 1 FROM Customer WITH (NOLOCK) WHERE IDNumber = '2511' AND
Period = @Period
)
BEGIN
DELETE FROM Customer WHERE IDNumber = '2511' AND Period = @Period
END
END
答案 0 :(得分:2)
您在寻找
DECLARE @Period CHAR(1)= '?';
DELETE FROM Customer
WHERE IDNumber = '2511'
AND Period = @Period
AND(@Period = 'M' OR @Period = 'W');
或者,如果您想删除IDNumber = '2511'
以及'W'
和'M'
的所有行,则可以这样做
DELETE FROM Cutomer
WHERE IDNumber = '2511'
AND
(Period = 'M' OR Period = 'W');-- Period IN('M', 'W');
由于您要同时删除两者,因此需要将变量的长度从1
更改为3
,然后可以使用 LEFT()
和< strong> RIGHT()
的功能为
DECLARE @Period CHAR(3) = 'M,W';
DELETE FROM Customer
WHERE IDNumber = '2511'
AND
(Period = LEFT(@Period, 1) OR Period = RIGHT(@Period, 1));
或将 LIKE
运算符用作
DECLARE @Period CHAR(3)='M,W';
DELETE FROM Customer
WHERE IDNumber = '2511'
AND
',' + @Period + ',' LIKE '%,' + Period + ',%';
如果您确实要使用IN()
运算符,则有三种选择:
1-使用 common table expression (CTE)
DECLARE @Period CHAR(3)='M,W';
WITH CTE AS
(
SELECT LEFT(@Period, 1) Val
UNION
SELECT RIGHT(@Period, 1)
)
DELETE FROM Customer
WHERE IDNumber = '2511'
AND
Period IN(SELECT * FROM CTE);
-2使用 SubQuery
DECLARE @Period CHAR(3)='M,W';
DELETE FROM Customer
WHERE IDNumber = '2511'
AND
Period IN(
SELECT LEFT(@Period, 1)
UNION
SELECT RIGHT(@Period, 1)
);
3-使用 STRING_SPLIT()
函数(或您自己的字符串拆分器函数)
DECLARE @Period CHAR(3)='M,W';
DELETE FROM Customer
WHERE IDNumber = '2511'
AND
Period IN(
SELECT Value
FROM STRING_SPLIT(@Period, ',')
);
结论:
希望使用 IN()
运算符
确定指定的值是否与子查询或列表中的任何值匹配。
因此,当您将变量赋给IN()
运算符时,它不会执行您期望的操作,因为您的变量是 string ,而不是子查询或 list 都没有。这就是为什么以下查询不会删除任何行的原因。
DECLARE @Period CHAR(3)='M,W';
DELETE FROM Customer
WHERE IDNumber = '2511'
AND
Period IN(@Period);
答案 1 :(得分:0)
您的代码无效,因为您尚未为@Period
分配值。想必您的意图是这样的:
IF EXISTS (SELECT TOP (1) 1
FROM Customer
WHERE IDNumber = '2511' AND Period IN ('M', 'W')
)
BEGIN
DELETE FROM Customer
WHERE IDNumber = '2511' AND Period IN ('M', 'W');
END;
这将删除Customers
中的所有匹配行,因此IF
是不必要的。一个没有条件的简单删除会做同样的事情:
DELETE FROM Customer
WHERE IDNumber = '2511' AND Period IN ('M', 'W');
如果您只想删除一个匹配行:
DELETE c FROM
FROM (SELECT TOP (1) c.*
FROM Customer c
WHERE c.IDNumber = '2511' AND c.Period IN ('M', 'W')
);
我建议您不要忘记@period
,直到您了解如何真正地去做DELETE
。