Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Where子句中的子字符串_Sql_Substring_Varchar - Fatal编程技术网

Sql Where子句中的子字符串

Sql Where子句中的子字符串,sql,substring,varchar,Sql,Substring,Varchar,下面是我的查询,我正在寻找只有子字符串值(将为YYYY)小于当前年份(25年)的记录。。。。我应该提到的是,这个字段是varchar,可能需要转换,我也没能成功地转换 SELECT AccountNumber, LoanPrimeLongName, convert (varchar,LoanOpenDate,103)LoanOpenDate, LoanOriginalBalance,

下面是我的查询,我正在寻找只有子字符串值(将为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

假设您的“YYYY”字段是
(子字符串(loandescription,1,4)与“[^0-9]%”不同)

和子字符串(loandescription,1,4)与“[^0-9]”不同时的大小写
然后将(子字符串(loandescription,1,4)转换为INT
其他年份(GETDATE())
结束<年(日期添加(年,-25,GETDATE())

您需要
CASE
语句,因为年份并不总是填充的,文本值也不会
CAST
INT
添加您的25年标准。

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

使用该函数确定
子字符串(loandescription,1,4)
是否实际上是一个数字。如果是,则您可以在该点对其进行强制转换/转换,并将其与您感兴趣的“年份”进行比较。即:

        ...
        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)进行测试。

我不知道如何以更好的格式发布查询选择文本,然后按
{}
按钮,或按
ctrl+k
。我正在从描述示例“2005 Chevrolet Camaro”中提取一个子字符串。我正在尝试对年份进行子字符串,然后仅提取25年前的值。我不断收到“转换varchar值时转换失败”的错误消息“对于数据类型int,我很抱歉说得含糊不清,我不确定所有信息都有什么帮助,尤其是在不了解数据库的情况下,我对SQL有一定的背景,但还不是它的专家……啊,所以听起来问题是您的年份不总是填充。请参阅更新。因为SQL Server优化器的工作方式(大多数SQL优化器不使用短路,请参见此处:),这并不一定是安全的。您需要在条件表达式时将测试(
ISNUMERIC
)放在
的情况下,然后在其
then
子句中隐藏用法(
CAST
)。
        ...
        ProcessDate = (CONVERT(VARCHAR, GETDATE(), 112)-1)) AND
        (ISNUMERIC(SUBSTRING(loandescription,1,4)) = 1 AND 
        CAST(SUBSTRING(loandescription,1,4) AS INT) = (YEAR(GETDATE()) - 25))