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的答案应该有效。尝试此查询,不确定它是否工作正常,因为我没有您的表,如果有任何运行时问题请更新我-尝试此查询,不确定它是否工作正常,因为我没有您的表,如果有任何运行时问题请更新我-