Where子句中的子串

时间:2013-08-21 16:28:33

标签: sql substring varchar

下面是我的查询,我希望拉出记录,其中只有子字符串值(将是YYYY)小于当前年份 - 25年....我应该提到这个字段是varchar并且可能需要转换成我无法成功的。

SELECT 
            AccountNumber,
            LoanPrimeLongName,
            convert (varchar,LoanOpenDate,103)LoanOpenDate,
            LoanOriginalBalance,
            LoanBalance,
            LoanInterestRate,
            LoanRemainingTermMonths,
            LoanDelqDays,
            LoanDescription
FROM 
            ARCU.ARCULoanDetailed 
WHERE 
            (((LOANTYPE = '15'          OR
            LOANTYPE = '16'         OR
            LoanType = '17')            AND
            LoanStatus = 'Open')        AND
            ProcessDate = (CONVERT(VARCHAR, GETDATE(), 112)-1)) AND
            (SUBSTRING (loandescription,1,4) not like '%[^0-9]%')

ORDER BY AccountNumber

2 个答案:

答案 0 :(得分:3)

由于我们不知道您使用的是哪种RDBMS,因此我将采用最简单的答案。假设您正在使用MSSQL。

使用ISNUMERIC()功能确定SUBSTRING(loandescription,1,4)实际上是否为数字。如果是,那么你可以在那时进行转换/转换并将它与你感兴趣的“年份”进行比较.IE:

        ...
        ProcessDate = (CONVERT(VARCHAR, GETDATE(), 112)-1)) AND
        (ISNUMERIC(SUBSTRING(loandescription,1,4)) = 1 AND 
        CAST(SUBSTRING(loandescription,1,4) AS INT) = (YEAR(GETDATE()) - 25))

由于布尔短路,如果前4个字符不是数字,那么它就不会费力去比较。同样的规则适用于其他RDBMS系统(例如MySQL,PostgreSQL,SQLite等),但方法可能有点不同。事实上,我认为MySQL或PostgreSQL甚至没有ISNUMERIC函数,这意味着您需要找到其他方法(Regex)进行测试。

答案 1 :(得分:1)

假设您的'YYYY'字段为(SUBSTRING (loandescription,1,4) not like '%[^0-9]%')

AND CASE WHEN SUBSTRING (loandescription,1,4) not like '%[^0-9]%' 
            THEN CAST(SUBSTRING(loandescription,1,4)AS INT 
            ELSE YEAR(GETDATE()) 
     END < YEAR(DATEADD(year,-25,GETDATE()))

您需要CASE语句,因为并非始终填充年份,文字值不会CASTINT。然后,您将GETDATE()功能与DATEADD()结合使用,以添加25年的标准。