2017-04-17 73 views
0

所以我有一個不同時區的字符串表。 一些時間段都有括號後他們如:charindex在一些字符串上工作,但不是另一個字符串。爲什麼不一致?

  1. 中部夏令時間(北美)
  2. 山地標準時間(墨西哥)

因此,我們要進去擺脫一切括號,和我使用CHARINDEX這樣做:

select TimeZoneName, 
CHARINDEX(' (' , TimeZoneName) as indexTZ2, 
Case When CHARINDEX(' (' , TimeZoneName)= 0 Then TimeZoneName 
    Else LEFT(TimeZoneName,CHARINDEX (' (' ,TimeZoneName)-1) End 
as TZ2 
from TimeZone 

,這裏是我的輸出:

TimeZoneName       indexTZ2 TZ2 
Mountain Standard Time (North America) 0   Mountain Standard Time (North America) 
Mountain Standard Time (Mexico)   23   Mountain Standard Time 

現在我很困惑,爲什麼相同的代碼適用於其中一個(墨西哥一)而不是另一個(北美一)? 數據來自同一個表,因此此列中的數據類型相同。

+0

想知道「(北美)」前的空白字符是不是一個真正的空間。 –

+0

嗨@JohnPasquet我該如何檢查?我試圖複製並粘貼到某個地方的字符串,這是一個空間。我的測試方法可能非常不成熟,請諮詢! – alwaysaskingquestions

+1

只需使用括號的索引並且不包含之前的空格。您可以使用LTRIM(RTRIM())去除空白,這是必要的。 或 從括號的索引中減去2。 –

回答

2

我猜問題是,與之前的括號中的空白字符。這是唯一有意義的事情。也許這是一個製表符或非破壞空間。

我的建議是排除包機,然後減去2

SELECT TimeZoneName, 
    CHARINDEX('(' , TimeZoneName) as indexTZ2, 
    Case When CHARINDEX('(' , TimeZoneName)= 0 Then TimeZoneName 
    Else LEFT(TimeZoneName,CHARINDEX ('(' ,TimeZoneName) - 2) End as TZ2 
FROM TimeZone 
+0

謝謝,你的回答很簡單有效! – alwaysaskingquestions

0

實現此邏輯的一種簡單方法是在第一個(後刪除所有內容。所以:

select left(TimeZoneName, charindex(' (', TimeZoneName + ' (')) 

注意,這追加' (',確保圖案的某處發現,如果只在字符串的結尾被搜索。

你的代碼(也可能是上面的代碼)不能工作的原因可能是因爲數據中還有其他字符。我可能會建議只是着眼於(而不是之前的空間:

select left(TimeZoneName, charindex('(', TimeZoneName + '(') - 1) 
+0

你說的是,加入「(」到最後是沒有「(」字符串中的情況,對嗎? – alwaysaskingquestions

+0

@alwaysaskingquestions ...是的, –

相關問題