排除以“ 836”开头的列值的记录

时间:2019-06-06 19:30:03

标签: sql sql-server notin

所以我的最新问题是我需要能够排除索赔号以“ 836”开头的记录。这似乎很简单,但是我尝试过的任何方法似乎都没有用,因为我仍在找回以“ 836”开头的索偿数字。我试过使用NOT LIKE和NOT IN。

请问我做错了什么吗?我包括查询和我的评论。预先感谢您的输入。

@Entity
@Table(name = "users")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "username")
    private String username;
    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address;
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
    @JoinColumn(name = "user_id")
    private Collection<TodoItem> todoItems = new LinkedHashSet<>();


    public User() {

    }

    public User(String username) {
        this.username = username;
    }

    public User(String username, Address address) {
        this.username = username;
        this.address = address;
    }

    public User(String username, Address address, Collection<TodoItem> todoItems) {
        this.username = username;
        this.address = address;
        this.todoItems = todoItems;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Collection<TodoItem> getTodoItems() {
        return todoItems;
    }

    public void setTodoItems(Collection<TodoItem> todoItems) {
        this.todoItems = todoItems;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public boolean equals(Object user) {
        if (this == user)
            return true;
        if (user == null || getClass() != user.getClass())
            return false;

        User u = (User) user;

        return id.equals(u.getId()) && username.equals(u.getUsername());
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", address=" + getAddress() +
                ", todoItems=" + getTodoItems() +
                '}';
    }
}

2 个答案:

答案 0 :(得分:0)

我添加了列ClaimNumberWithoutPrefix并基于此进行过滤。您原始的ClaimNumber在c.ClaimPrefix + '-'开头有类似的内容。请注意,如果c.ClaimPrefix is null,则整个表达式为is null。为避免这种情况,您可以使用concat(c.ClaimPrefix + '-', c.ClaimNumber)

SELECT
  qle.LPRG_SID
  ,lc.PACClaimID
  ,ems.EquipmentID
  ,c.ClaimID
  ,(c.ClaimPrefix + '-' + CONVERT(varchar, c.ClaimNumber)) AS ClaimNumber
  ,ClaimNumber as ClaimNumberWithoutPrefix
  ,CONVERT(date, CreateDate) AS CreateDate
  ,CONVERT(date, c.LossDate) AS LossDate
  ,CASE WHEN DATEPART(hh, EffectiveDate) < 17 then CONVERT(date, EffectiveDate) ELSE CONVERT(date, dateadd(dd, 1, EffectiveDate)) END as ProCloseDate
  ,-1 AS ProducerCommBridgeKey
  ,cs.ClaimStatus
  ,UPPER(LEFT(c.ContractNumber, 10)) AS ContractNumber
  ,CASE WHEN c.ContractNumber IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END AS PolicyID
  ,sCustomerID AS CustomerID
  ,CASE WHEN pro.sProductID = '9095' THEN '1095' ELSE pro.sProductID END AS ProductID
  ,c.CatastropheID
  ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode)))), 'UNKNOWN')  END AS InsuranceClassCode
  ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName)))), 'UNKNOWN')  END AS EquipmentName
  ,CASE WHEN EquipmentClassName IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentClassName)))) END AS EquipmentClassName
  ,CASE WHEN EquipmentDescription IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentDescription)))) END AS EquipmentDescription
  ,RegionCode
  ,CountryCode
  ,CASE WHEN ClaimLossType IS NULL THEN 'Unknown' ELSE ClaimLossType END AS ClaimLossType
  ,CASE WHEN CauseOfLoss IS NULL THEN 'Unknown' ELSE CauseOfLoss END AS CauseOfLoss
  ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_SID) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lc.EnrollmentID) ELSE NULL END AS EnrollmentID
  ,NULL AS CoverageID
  ,NULL AS CoverageEffectiveDate
  ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_LEASE_CODE) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lefs.ContractNumber) ELSE NULL END AS CustomerAccountNumber
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 0 AND TranTypeID = 1 THEN Amount END) AS PaidLossAmount
  ,SUM(CASE WHEN Reserve = 1 AND Recovery = 0 AND TranTypeID = 1 THEN Amount END) AS CaseReserveAmount
  ,SUM(CASE WHEN Reserve = 1 AND Recovery = 1 AND TranTypeID IN (1, 7, 8) THEN Amount END) AS RecoveryReserveAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID = 8 THEN Amount END) AS SalvageRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID = 7 THEN Amount END) AS SubroRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 1 AND TranTypeID IN (1, 7, 8) THEN Amount END) AS TotalRecoveryAmount
  ,SUM(CASE WHEN Reserve = 0 AND Recovery = 0 AND TranTypeID = 6 THEN Amount END) AS AllocatedLAEAmount     
  FROM dbo.ExtPACTransaction t
  INNER JOIN dbo.ExtPACClaim c ON t.ClaimID = c.ClaimID
                              --AND c.ClaimNumber NOT LIKE '836%'
  INNER JOIN dbo.ExtPRSDEPolicy pol ON (CASE WHEN [ContractNumber] IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END) = pol.sPolicyID
  INNER JOIN dbo.ExtPRSDECustomer cus ON pol.iCustomerKey = cus.iCustomerKey
  INNER JOIN dbo.ExtPRSDEProduct pro ON pol.iProductKey = pro.iProductKey
  LEFT OUTER JOIN dbo.ExtPACClaimStatus cs ON c.ClaimID = cs.ClaimID
  LEFT OUTER JOIN dbo.ExtJWProductSegment jw ON pro.sProductID = jw.sProductID
  LEFT OUTER JOIN dbo.ExtEMSEquipment ems ON c.EMIEquipmentID = CONVERT(varchar, ems.EquipmentNumber)
  LEFT OUTER JOIN dbo.ExtQIPSClaims qc ON qc.CLAM_PAC_CLAIMID = c.ClaimID
  LEFT OUTER JOIN dbo.ExtQIPSLeaseEnrollment qle ON qle.LPRG_SID = qc.CLAM_LPRG_SID
  LEFT OUTER JOIN dbo.ExtLP2Claim lc ON lc.PACClaimID = c.ClaimID
  LEFT OUTER JOIN dbo.ExtLP2EnrollmentForSearch lefs ON lefs.EnrollmentID = lc.EnrollmentID
  WHERE c.LossDate >= @StartDate
  --AND c.ClaimNumber NOT LIKE '836%' -- To remove FIS claims
  --AND c.ClaimNumber NOT IN (SELECT c2.ClaimNumber FROM ExtPACClaim c2 WHERE ClaimNumber LIKE '836%')
  AND c.isVoided = 0
  AND (pro.sProductID = '9095' OR jw.sProductID IS NOT NULL)
  GROUP BY qle.LPRG_SID
    ,lc.PACClaimID
    ,ems.EquipmentID
    ,c.ClaimID
    ,(c.ClaimPrefix + '-' + CONVERT(varchar, c.ClaimNumber)) 
    ,ClaimNumber
    ,CONVERT(date, CreateDate) 
    ,CONVERT(date, c.LossDate) 
    ,CASE WHEN DATEPART(hh, t.EffectiveDate) < 17 then CONVERT(date, t.EffectiveDate) ELSE CONVERT(date, dateadd(dd, 1, t.EffectiveDate)) END
    ,cs.ClaimStatus
    , UPPER(LEFT(c.ContractNumber, 10))
    ,CASE WHEN c.ContractNumber IS NOT NULL THEN LEFT(c.PolicyNumber, 7) ELSE c.PolicyNumber END 
    ,sCustomerID 
    ,CASE WHEN pro.sProductID = '9095' THEN '1095' ELSE pro.sProductID END 
    ,c.CatastropheID
    ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(InsuranceClassCode)))), 'UNKNOWN')  END
    ,CASE WHEN LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName))) = '' THEN 'UNKNOWN' ELSE COALESCE(UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentName)))), 'UNKNOWN')  END
    ,CASE WHEN EquipmentClassName IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentClassName)))) END
    ,CASE WHEN EquipmentDescription IS NULL THEN 'UNKNOWN' ELSE UPPER(LTRIM(RTRIM(dbo.fn_clean_string(EquipmentDescription)))) END
    ,RegionCode
    ,CountryCode
    ,CASE WHEN ClaimLossType IS NULL THEN 'Unknown' ELSE ClaimLossType END
    ,CASE WHEN CauseOfLoss IS NULL THEN 'Unknown' ELSE CauseOfLoss END 
    ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_SID) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lc.EnrollmentID) ELSE NULL END
    ,CASE WHEN qc.CLAM_LPRG_SID IS NOT NULL THEN CONVERT(nvarchar(50), qle.LEAS_LEASE_CODE) WHEN lc.EnrollmentID IS NOT NULL THEN CONVERT(nvarchar(50), lefs.ContractNumber) ELSE NULL END

  --ORDER BY ClaimNumber DESC
;

--To view records
SELECT *
FROM ##FctLossData
WHERE ClaimNumberWithoutPrefix LIKE '836%'

答案 1 :(得分:0)

您可以尝试在LIKE子句中进行[^] NotIn模式匹配以从836开始过滤掉值。我在下面给出了示例代码供您参考。进一步了解LIKE clause

CREATE TABLE #test(ClaimNumber VARCHAR(34))

INSERT INTO #test values('836789'),('567890'),('423897')

SELECT * FROM #test
WHERE claimNumber LIKE '[^8][^3][^6]%'

顺便说一句,我看到您正在使用CONVERT(VARCHAR, ClaimNumber)。始终为VARCHAR指定长度。如果未指定长度,它将在不同位置应用不同的默认长度。如果是CONVERT,它将应用VARCHAR(30)。在表创建列定义中,它将应用VARCHAR(1)。我建议您阅读有关TSQL bad practice

的信息