2013-08-21 93 views
4

以下是我的查詢,我正在尋找只有子字符串值(將爲YYYY)小於當前年份 - 25年的記錄......並且我應該提及該字段是varchar並可能需要轉換,我還沒有成功做到。Where子句中的子字符串

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 
+0

我對此很陌生,不確定如何以更好的格式發佈查詢 – villiec

+0

選擇文本,然後按下「{}」按鈕或按下「ctrl + k」。 –

+0

謝謝布拉德! :) – villiec

回答

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個字符不是活得T數字,那麼它不會打擾比較。同樣的規則適用於其他RDBMS系統(如MySQL,PostgreSQL,SQLite等),但方法可能有點不同。事實上,我不認爲MySQL或PostgreSQL甚至有ISNUMERIC函數,這意味着你需要找到其他方式(Regex)來測試。

+1

由於SQL Server優化器的工作原理(大多數SQL優化器不*使用短 - 電路,見這裏:http://stackoverflow.com/a/1445911/109122),這不一定是安全的。你需要把測試('ISNUMERIC')放在'CASE WHEN'條件表達式中,然後隱藏在其THEN條款中使用('CAST')是安全的。 – RBarryYoung

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年標準。

+0

我拉一個子字符串形式描述示例'2005雪佛蘭Camaro'我試圖substring年,然後拉只有值25歲。我不斷收到錯誤,「轉換失敗時,將varchar值」HOME「轉換爲數據類型int我爲模糊道歉,我不確定所有信息都會幫助,特別是在不知道數據庫的情況下,我在SQL中有一些背景,但我不是一個大師,但它... – villiec

+0

啊,所以這聽起來像問題是你的一年並不總是人口稠密。見更新。 –

相關問題