2016-07-28 79 views
0

我有數據類型VARCHAR列policy_date更新字段發現場的LEN,如果len爲小於8列

Policy_date 
----------- 
A1999062 
20010405 

我想ISNUMERIC時 情況來更新數據(policy_date)= 0,然後修改字母表(1999062)並檢查len是否小於8,然後將其設置爲NULL其他Policy_date。

注:我必須將日期字段轉換爲date數據類型而不是varchar。 我放出來應該是這樣的:

Policy_Date 
----------- 
NULL 
2001-04-05 

任何人都可以編寫SQL case語句。 謝謝, Swathi。

+0

我無法寫case語句,但這裏是我試過.. 選擇RIGHT([policy_date],LEN([policy_date]) - 1)AS MyTrimmedColumn 從表 其中isnumeric([policy_date])= 0 – swathi

+2

您正在使用哪個版本的SQL Server?自SQL Server 2012(TRY_PARSE,TRY_CONVERT和TRY_CAST)以來,已經添加了幾個函數可用於幫助解決此問題。 –

回答

2

根據你的評論,你只是想刪除第一個字符的位置,如果它是阿爾法。這消除了對函數/ CLR調用的需要。如果這個需求改變了,你將需要創建一個函數來去除字符,但其餘的查詢將會起作用。

Create Table #Test (PolicyDate Varchar(8000)) 
Insert #Test Values ('A19990602') 
Insert #Test Values ('A1999062') 
Insert #Test Values ('20010405') 

Select Convert(Date, 
     Case When IsNumeric(PolicyDate) = 0 Then 
      Case When Len(PolicyDate) < 9 Then Null 
       Else Right(PolicyDate, Len(PolicyDate) -1) End 
      Else PolicyDate 
      End) PolicyDate2 
    From #Test 

示例功能,有很多可用的方法,哪種方法更快。

CREATE Function [fnRemoveNonNumericCharacters](@strText VARCHAR(1000)) 
RETURNS VARCHAR(1000) 
AS 
BEGIN 
    WHILE PATINDEX('%[^0-9]%', @strText) > 0 
    BEGIN 
     SET @strText = STUFF(@strText, PATINDEX('%[^0-9]%', @strText), 1, '') 
    END 
    RETURN @strText 
END 

ps。我使用了IsNumeric(),因爲這就是你說的你想實現的。但是請注意,通過設計,可以包含certian字符,並且仍然有函數返回它是一個數字。 IsNumeric($1,230.54)將返回1.如果這是一個問題,則使用替代方法,例如TRY_PARSE(PolicyDate as int)用於sql2012及更高版本。

+1

請不要使用ISNUMERIC()。 SELECT ISNUMERIC($),ISNUMERIC('。'),ISNUMERIC(',') – dfundako

+0

謝謝Joe c – swathi

+0

Joe c - 我對發送的#Test查詢做了小改動 創建表#Test(PolicyDate Varchar(8000 )) 插入#TEST VALUES( 'A19990602') 插入#TEST VALUES( 'A1999062') 插入#TEST VALUES( '20010405') 選擇Convert(日期, 案例時則IsNumeric(PolicyDate)= 0,則 如果Len(PolicyDate)<9 Then'' Else Right(PolicyDate,Len(PolicyDate)-1)End Else PolicyDate End)PolicyDate2 From #Test When i make nULL to ''然後在輸出我得到的日期爲1900-01-01,我希望這是''。任何建議? – swathi

0

您可以取最右邊的8個字符,用stuff()注入兩個連字符,然後檢查這是否與isdate()有效。如果是這樣,重複相同,使轉化率隨cast()

select case when len(policy_date) >= 8 
       and isdate(stuff(stuff(right(policy_date, 8), 7, '-'), 5, '-')) then 
      cast(stuff(stuff(right(policy_date, 8), 7, '-'), 5, '-') as datetime) 
     end