【问题标题】:Insert Null where value is empty using insert select query使用插入选择查询在值为空的地方插入 Null
【发布时间】:2019-07-29 10:01:29
【问题描述】:

我在 .net c# 中使用插入选择查询。当某些值为空时,不会插入数据。

根据我的代码,仅当 Title/category/occupation/gender/MaritalStatusDesc/Qualification 值为空时,才不会插入数据。

INSERT INTO odisha_customer_data 
            ([share _id], 
             firstname, 
             middlename, 
             lastname, 
             fatherhusbandname, 
             mothername, 
             id, 
             dob, 
             age, 
             custnaturedesc, 
             [date of membership], 
             religion, 
             nationality, 
             uid, 
             pan, 
             segment, 
             introduceraccno, 
             empcode, 
             idproof, 
             idproofno, 
             residentialproofdesc, 
             residentialproofno, 
             annualincomedetails, 
             [risk category of customer], 
             [closing bal], 
             title, 
             gender, 
             category, 
             occupation, 
             community, 
             qualification, 
             maritalstatusdesc) 
SELECT @ShareId, 
       @FirstName, 
       @MiddleName, 
       @LastName, 
       @FatherHusbandName, 
       @MotherName, 
       @id, 
       @DOB, 
       @Age, 
       @CustNatureDesc, 
       @DateofMembership, 
       @Religion, 
       @Nationality, 
       @UID, 
       @PAN, 
       @Segment, 
       @IntroducerAccNo, 
       @EmpCode, 
       @IDproof, 
       @IDProofNo, 
       @ResidentialProofDesc, 
       @ResidentialProofNo, 
       @AnnualIncomeDetails, 
       @RiskCategoryofcustomer, 
       @ClosingBal, 
       t.titleid         AS title, 
       g.genderid        AS gender, 
       cat.catagoryid    AS category, 
       o.occupationid    AS Occupation, 
       c.communityid     AS Community, 
       q.qualificationid AS Qualification, 
       m.maritalstatusid AS MaritalStatus 
FROM   title t, 
       gender g, 
       catagory cat, 
       occupation o, 
       community c, 
       qualification q, 
       maritalstatus m 
WHERE  t.title = @Title 
       AND g.gendername = @gender 
       AND cat.catagoryname = @category 
       AND o.occupationname = @occupation 
       AND c.communityname = @community 
       AND q.qualificationname = @Qualification 
       AND m.maritalstatusdesc = @MaritalStatusDesc 

请检查我的代码。并告诉我在给定值为空时设置 Null。


String query = "insert into Odisha_Customer_data([Share _Id], FirstName, MiddleName, LastName, FatherHusbandName, MotherName, "
                        + "id,  DOB, Age, CustNatureDesc, [Date of Membership], "
                    + "Religion, Nationality, UID, PAN, Segment, IntroducerAccNo, EmpCode, IDproof, IDProofNo, ResidentialProofDesc, ResidentialProofNo, "
                    + "AnnualIncomeDetails, [Risk Category of customer], [Closing Bal], Title, gender, category, occupation, community, Qualification, MaritalStatusDesc)"+
                    " SELeCT @ShareId, @FirstName, @MiddleName, @LastName, @FatherHusbandName, @MotherName, @id,"
                    + "@DOB, @Age, @CustNatureDesc, @DateofMembership, @Religion, @Nationality, @UID, @PAN,"
                    + " @Segment, @IntroducerAccNo, @EmpCode, @IDproof, @IDProofNo, @ResidentialProofDesc, @ResidentialProofNo, @AnnualIncomeDetails, @RiskCategoryofcustomer, @ClosingBal," +
                    "t.TitleID AS title, g.GenderId AS gender, cat.CatagoryID AS category, o.OccupationID AS Occupation, c.CommunityID AS Community, q.QualificationID AS Qualification," +
                    " m.MaritalStatusID AS MaritalStatus FROM Title AS t INNER JOIN Gender AS g ON t.Title = @title INNER JOIN Catagory AS cat ON cat.catagoryname = @Category " +
                    "INNER JOIN Occupation AS o ON o.OccupationName = @Occupation INNER JOIN Community AS c ON c.CommunityName = @Community " +
                    " INNER JOIN Qualification AS q ON q.QualificationName = @qualification INNER JOIN MaritalStatus AS m ON m.MaritalStatusDesc = @maritalStatusDesc " +
                    "WHERE @title Is Not Null AND g.gendername = @Gender AND @Category Is Not Null AND @Occupation Is Not Null " +
                    "AND @Community Is Not Null AND @qualification Is Not Null AND @maritalStatusDesc Is Not Null";

                //query = "UPDATE a SET a.MaritalStatusDesc = b.MaritalStatusID From Odisha_Customer_data AS a INNER JOIN MaritalStatus AS b ON b.MaritalStatusDesc = '" + MaritalStatusDesc + "' where a.rowid = (Select max(rowid) as NewCustomer from Odisha_Customer_data)";

                SqlCommand cmd = new SqlCommand(query, con);

                cmd.Parameters.Add(new SqlParameter("@title", string.IsNullOrEmpty(Title) ? (object)DBNull.Value : Title));
                cmd.Parameters.Add(new SqlParameter("@Gender", string.IsNullOrEmpty(gender) ? (object)DBNull.Value : gender));
                cmd.Parameters.Add(new SqlParameter("@Occupation", string.IsNullOrEmpty(occupation) ? (object)DBNull.Value : occupation));
                cmd.Parameters.Add(new SqlParameter("@Category", string.IsNullOrEmpty(category) ? (object)DBNull.Value : category));
                cmd.Parameters.Add(new SqlParameter("@Community", string.IsNullOrEmpty(community) ? (object)DBNull.Value : community));
                cmd.Parameters.Add(new SqlParameter("@qualification", string.IsNullOrEmpty(Qualification) ? (object)DBNull.Value : Qualification));
                cmd.Parameters.Add(new SqlParameter("@maritalStatusDesc", string.IsNullOrEmpty(MaritalStatusDesc) ? (object)DBNull.Value : MaritalStatusDesc));

                cmd.Parameters.Add(new SqlParameter("@ShareId", string.IsNullOrEmpty(ShareId) ? (object)DBNull.Value : ShareId));
                cmd.Parameters.Add(new SqlParameter("@FirstName", string.IsNullOrEmpty(FirstName) ? (object)DBNull.Value : FirstName));
                cmd.Parameters.Add(new SqlParameter("@MiddleName", string.IsNullOrEmpty(MiddleName) ? (object)DBNull.Value : MiddleName));
                cmd.Parameters.Add(new SqlParameter("@LastName", string.IsNullOrEmpty(LastName) ? (object)DBNull.Value : LastName));
                cmd.Parameters.Add(new SqlParameter("@FatherHusbandName", string.IsNullOrEmpty(FatherHusbandName) ? (object)DBNull.Value : FatherHusbandName));
                cmd.Parameters.Add(new SqlParameter("@MotherName", string.IsNullOrEmpty(MotherName) ? (object)DBNull.Value : MotherName));
                cmd.Parameters.Add(new SqlParameter("@id", string.IsNullOrEmpty(id) ? (object)DBNull.Value : id));
                cmd.Parameters.Add(new SqlParameter("@DOB", string.IsNullOrEmpty(DOB) ? (object)DBNull.Value : DOB));
                cmd.Parameters.Add(new SqlParameter("@Age", string.IsNullOrEmpty(Age) ? (object)DBNull.Value : Age));
                cmd.Parameters.Add(new SqlParameter("@CustNatureDesc", string.IsNullOrEmpty(CustNatureDesc) ? (object)DBNull.Value : CustNatureDesc));
                cmd.Parameters.Add(new SqlParameter("@DateofMembership", string.IsNullOrEmpty(DateofMembership) ? (object)DBNull.Value : DateofMembership));
                cmd.Parameters.Add(new SqlParameter("@Religion", string.IsNullOrEmpty(Religion) ? (object)DBNull.Value : Religion));
                cmd.Parameters.Add(new SqlParameter("@Nationality", string.IsNullOrEmpty(Nationality) ? (object)DBNull.Value : Nationality));
                cmd.Parameters.Add(new SqlParameter("@UID", string.IsNullOrEmpty(UID) ? (object)DBNull.Value : UID));
                cmd.Parameters.Add(new SqlParameter("@PAN", string.IsNullOrEmpty(PAN) ? (object)DBNull.Value : PAN));
                cmd.Parameters.Add(new SqlParameter("@Segment", string.IsNullOrEmpty(Segment) ? (object)DBNull.Value : Segment));
                cmd.Parameters.Add(new SqlParameter("@IntroducerAccNo", string.IsNullOrEmpty(IntroducerAccNo) ? (object)DBNull.Value : IntroducerAccNo));
                cmd.Parameters.Add(new SqlParameter("@EmpCode", string.IsNullOrEmpty(EmpCode) ? (object)DBNull.Value : EmpCode));
                cmd.Parameters.Add(new SqlParameter("@IDproof", string.IsNullOrEmpty(IDproof) ? (object)DBNull.Value : IDproof));
                cmd.Parameters.Add(new SqlParameter("@IDProofNo", string.IsNullOrEmpty(IDProofNo) ? (object)DBNull.Value : IDProofNo));
                cmd.Parameters.Add(new SqlParameter("@ResidentialProofDesc", string.IsNullOrEmpty(ResidentialProofDesc) ? (object)DBNull.Value : ResidentialProofDesc));
                cmd.Parameters.Add(new SqlParameter("@ResidentialProofNo", string.IsNullOrEmpty(ResidentialProofNo) ? (object)DBNull.Value : ResidentialProofNo));
                cmd.Parameters.Add(new SqlParameter("@AnnualIncomeDetails", string.IsNullOrEmpty(AnnualIncomeDetails) ? (object)DBNull.Value : AnnualIncomeDetails));
                cmd.Parameters.Add(new SqlParameter("@RiskCategoryofcustomer", string.IsNullOrEmpty(RiskCategoryofcustomer) ? (object)DBNull.Value : RiskCategoryofcustomer));
                cmd.Parameters.Add(new SqlParameter("@ClosingBal", string.IsNullOrEmpty(ClosingBal) ? (object)DBNull.Value : ClosingBal));

                cmd.ExecuteNonQuery();
                con.Close();

我的完整代码是这样的,我只想要标题、性别等字符串值为空的地方,然后将 Null 保存在 DB 表中。但是使用此代码,只要标题、性别等字符串值为空,则不会插入数据。如果所有字符串都有值,那么数据将完美保存。请查看代码并纠正我。

【问题讨论】:

  • 您的列是否设置为允许 null 值?
  • 为什么?首先你是什么意思empty?空字符串不是 NULL,它是具有明确定义值的字符串。它可以插入到非空列中。导致问题的是 NULL's,而不是“空”字符串
  • 检查每个可空列的 IsNullOrEmpty() 并为它们传递 DBNull.Value
  • 对于查询本身,它会生成符合条件的所有标题、性别、类别等行的笛卡尔积。除非每个条件只返回 一个 结果,否则您可能会为同一个人获得多个条目。那是你真正想要的吗?您是否期望以这种方式从每个表中只获取一行,而不是编写正确的查找?
  • 进化——没有人应该使用old style joins

标签: sql sql-server


【解决方案1】:

有点不清楚你在问什么,因为“空”在 SQL 中没有技术意义。

我可以将其解释为参数值为NULL。如果是这样:

WHERE (t.title = @Title OR @Title IS NULL) AND
      (g.gendername = @gender OR @gender IS NULL) AND
      (cat.catagoryname = @category OR @category IS NULL) AND
      . . .

【讨论】:

    【解决方案2】:

    使用 IsNull 默认为可接受的值

    INSERT INTO odisha_customer_data 
                ([share _id], 
                 firstname, 
                 middlename, 
                 lastname, 
                 fatherhusbandname, 
                 mothername, 
                 id, 
                 dob, 
                 age, 
                 custnaturedesc, 
                 [date of membership], 
                 religion, 
                 nationality, 
                 uid, 
                 pan, 
                 segment, 
                 introduceraccno, 
                 empcode, 
                 idproof, 
                 idproofno, 
                 residentialproofdesc, 
                 residentialproofno, 
                 annualincomedetails, 
                 [risk category of customer], 
                 [closing bal], 
                 title, 
                 gender, 
                 category, 
                 occupation, 
                 community, 
                 qualification, 
                 maritalstatusdesc) 
    SELECT @ShareId, 
           @FirstName, 
           @MiddleName, 
           @LastName, 
           @FatherHusbandName, 
           @MotherName, 
           @id, 
           @DOB, 
           @Age, 
           @CustNatureDesc, 
           @DateofMembership, 
           @Religion, 
           @Nationality, 
           @UID, 
           @PAN, 
           @Segment, 
           @IntroducerAccNo, 
           @EmpCode, 
           @IDproof, 
           @IDProofNo, 
           @ResidentialProofDesc, 
           @ResidentialProofNo, 
           @AnnualIncomeDetails, 
           @RiskCategoryofcustomer, 
           @ClosingBal, 
           t.titleid         AS title, 
           g.genderid        AS gender, 
           cat.catagoryid    AS category, 
           o.occupationid    AS Occupation, 
           c.communityid     AS Community, 
           q.qualificationid AS Qualification, 
           m.maritalstatusid AS MaritalStatus 
    FROM   title t, 
           gender g, 
           catagory cat, 
           occupation o, 
           community c, 
           isnull(qualification,'NA') q, 
           maritalstatus m 
    WHERE  t.title = @Title 
           AND g.gendername = @gender 
           AND cat.catagoryname = @category 
           AND o.occupationname = @occupation 
           AND c.communityname = @community 
           AND q.qualificationname = @Qualification 
           AND m.maritalstatusdesc = @MaritalStatusDesc
    

    【讨论】:

    • OP 提出了相反的问题——当一个值为“空”时如何返回 NULL 无论如何
    【解决方案3】:

    如果您想在插入时将空格转换为空值,请尝试以下操作:

    INSERT INTO new_table ( empty_col, other )
    SELECT
       NULLIF(empty_col, ''),
       other
    FROM old_table
    

    如果这符合您的问题,请查看以下讨论以获取更多详细信息:

    How to convert empty spaces into null values, using SQL Server?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      相关资源
      最近更新 更多