C# 循环记录并根据条件更新数据库
我有一张桌子C# 循环记录并根据条件更新数据库,c#,sql,asp.net,sql-server,C#,Sql,Asp.net,Sql Server,我有一张桌子Person: 其中,ID是主键,Male是男性的总数,Female是女性的总数,Person\u ID列固定为4,因此男性+女性的最大数量是4(我们不必验证) 我需要在是或否的最后一列中插入/更新是否有效值,以确定记录是否有效 逻辑如下:例如,男性和女性的总数为3,则必须有3个人ID,或者如果男性和女性的总数为2,则必须有2个人ID数据 因此记录ID 3和4无效,因为记录3-有2个人(1男1女),但只有1个人ID,记录4有1个人(1女),但根本没有个人ID数据 我需要在c#代码中
Person
:
其中,ID
是主键,Male
是男性的总数,Female
是女性的总数,Person\u ID
列固定为4,因此男性+女性的最大数量是4(我们不必验证)
我需要在是
或否
的最后一列中插入/更新是否有效
值,以确定记录是否有效
逻辑如下:例如,男性和女性的总数为3,则必须有3个人ID,或者如果男性和女性的总数为2,则必须有2个人ID数据
因此记录ID 3和4无效,因为记录3-有2个人(1男1女),但只有1个人ID,记录4有1个人(1女),但根本没有个人ID数据
我需要在c#代码中以编程方式实现这一点,但首先我想知道可以解决此问题的查询是什么
我一直在思考的逻辑是:
- 循环遍历每一行
- 获得男性+女性的总和=a
- 以某种方式计算非空的个人ID单元格=b
- 如果a==b,则插入是,否则插入否
UPDATE TABLE
SET Is_Valid = CASE WHEN (
Case when Person1_ID != '' or Person1_ID IS NOT NULL Then 1 else 0 end +
Case when Person2_ID != '' or Person2_ID IS NOT NULL Then 1 else 0 end +
Case when Person3_ID != '' or Person3_ID IS NOT NULL Then 1 else 0 end +
Case when Person4_ID != '' or Person4_ID IS NOT NULL Then 1 else 0 end ) != Male + Female THEN 'NO' ELSE 'YES' END
;WITH CTE
AS (
SELECT id
,CASE
WHEN (male + female) = isnull(personid_1 / personid_1, 0)
+ isnull(personid_2 / personid_2, 0)
+ isnull(personid_3 / personid_3, 0)
+ isnull(personid_4 / personid_4, 0)
THEN 'Yes'
ELSE 'No'
END AS valid
FROM PERSON
)
UPDATE PERSON
SET IS_VALID = CTE.VALID
FROM CTE
WHERE PERSON.ID = CTE.ID
不需要循环
;WITH CTE
AS (
SELECT id
,CASE
WHEN (male + female) = isnull(personid_1 / personid_1, 0)
+ isnull(personid_2 / personid_2, 0)
+ isnull(personid_3 / personid_3, 0)
+ isnull(personid_4 / personid_4, 0)
THEN 'Yes'
ELSE 'No'
END AS valid
FROM PERSON
)
UPDATE PERSON
SET IS_VALID = CTE.VALID
FROM CTE
WHERE PERSON.ID = CTE.ID
您可以为此运行update语句,而不必循环执行它。或者,您可以将该值设置为有效的计算列
DECLARE @test TABLE (
id INT IDENTITY(1,1)
,male INT
,female INT
,person1_id INT
,person2_id INT
,person3_id INT
,person4_id INT
,is_valid AS CASE
WHEN (male + female = 1 AND person1_id IS NOT NULL AND person2_id IS NULL AND person3_id IS NULL AND person4_id IS NULL)
OR (male + female = 2 AND person1_id IS NOT NULL AND person2_id IS NOT NULL AND person3_id IS NULL AND person4_id IS NULL)
OR (male + female = 3 AND person1_id IS NOT NULL AND person2_id IS NOT NULL AND person3_id IS NULL AND person4_id IS NULL)
OR (male + female = 4 AND person1_id IS NOT NULL AND person2_id IS NOT NULL AND person3_id IS NOT NULL AND person4_id IS NULL)
THEN 1
ELSE 0
END
)
INSERT @test (male,female,person1_id,person2_id,person3_id,person4_id)
VALUES
(1,1,200,700,NULL,NULL)
,(2,0,205,210,NULL,NULL)
,(1,1,240,NULL,NULL,NULL)
,(0,1,NULL,NULL,NULL,NULL)
SELECT * FROM @test
您可以为此运行update语句,而不必循环执行它。或者,您可以将该值设置为有效的计算列
DECLARE @test TABLE (
id INT IDENTITY(1,1)
,male INT
,female INT
,person1_id INT
,person2_id INT
,person3_id INT
,person4_id INT
,is_valid AS CASE
WHEN (male + female = 1 AND person1_id IS NOT NULL AND person2_id IS NULL AND person3_id IS NULL AND person4_id IS NULL)
OR (male + female = 2 AND person1_id IS NOT NULL AND person2_id IS NOT NULL AND person3_id IS NULL AND person4_id IS NULL)
OR (male + female = 3 AND person1_id IS NOT NULL AND person2_id IS NOT NULL AND person3_id IS NULL AND person4_id IS NULL)
OR (male + female = 4 AND person1_id IS NOT NULL AND person2_id IS NOT NULL AND person3_id IS NOT NULL AND person4_id IS NULL)
THEN 1
ELSE 0
END
)
INSERT @test (male,female,person1_id,person2_id,person3_id,person4_id)
VALUES
(1,1,200,700,NULL,NULL)
,(2,0,205,210,NULL,NULL)
,(1,1,240,NULL,NULL,NULL)
,(0,1,NULL,NULL,NULL,NULL)
SELECT * FROM @test
添加
Male+Female
列值,并将其与具有非null或空值的列数进行比较。如果它们相等,则将设置为1,否则将其设置为0
update p
set Is_Valid =
case
when Male + Female = (iif(Isnull(Person1_ID, '') = '', 0, 1) + iif(Isnull(Person2_ID, '') = '', 0, 1) +
iif(Isnull(Person3_ID, '') = '', 0, 1) + iif(Isnull(Person4_ID, '') = '', 0, 1)) then 'YES'
else 'NO'
end
from Person p
为了澄清下面的代码,检查列是否有null值并将其置为空,然后检查列是否为空,如果为空,则将其置为0,否则将其置为1。这是针对每个列执行的:
iif(Isnull(Person1_ID, '') = '', 0, 1)
您也可以这样做,以便更仔细地检查空格:
iif(Isnull(rtrim(ltrim(Person1_ID))), '') = '', 0, 1)
添加Male+Female
列值,并将其与具有非null或空值的列数进行比较。如果它们相等,则将设置为1,否则将其设置为0
update p
set Is_Valid =
case
when Male + Female = (iif(Isnull(Person1_ID, '') = '', 0, 1) + iif(Isnull(Person2_ID, '') = '', 0, 1) +
iif(Isnull(Person3_ID, '') = '', 0, 1) + iif(Isnull(Person4_ID, '') = '', 0, 1)) then 'YES'
else 'NO'
end
from Person p
为了澄清下面的代码,检查列是否有null值并将其置为空,然后检查列是否为空,如果为空,则将其置为0,否则将其置为1。这是针对每个列执行的:
iif(Isnull(Person1_ID, '') = '', 0, 1)
您也可以这样做,以便更仔细地检查空格:
iif(Isnull(rtrim(ltrim(Person1_ID))), '') = '', 0, 1)
personid列是否固定为4列?@ShakeerMirza Yes我认为如果您规范化您的数据会更好,这样您就不会有四个Person_Id列,而是有一个主表和一个辅助表,其中包含以下列:Id、fkey to primary table、Male(bit)、Female(bit)、Person_Id。然后是所有四个(或任意多个)记录将指向主表中的同一记录。所有的值都是这样固定的,当您决定需要五个人的ID时,您必须同时修改模式和查询。否则,Long的答案应该有效。personid columns是否固定了4列?@Shakermirza Yes我认为如果您规范化您的数据会更好,这样您将有一个主表和一个辅助表,其中包含以下列:Id,fkey to primary table,Male(bit),Female(bit),Person_Id。然后所有四条(或任意多条)记录都将指向主表中的同一条记录。所有的值都是这样固定的,当您决定需要五个人的ID时,您必须同时修改模式和查询。否则,Long的答案应该有效。尝试此查询,不确定它是否工作正常,因为我没有您的表,如果有任何运行时问题请更新我-尝试此查询,不确定它是否工作正常,因为我没有您的表,如果有任何运行时问题请更新我-