所以我有一个包含不同时区字符串的表。 某些时区后面有括号,例如:
所以我们想摆脱括号内的所有内容,我正在使用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 :(得分: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
答案 1 :(得分:0)
实现此逻辑的一种简单方法是在第一个(
之后删除所有内容。所以:
select left(TimeZoneName, charindex(' (', TimeZoneName + ' ('))
请注意,这会附加' ('
以确保在某处找到模式,如果仅在搜索字符串的末尾。
您的代码(可能还有上面的代码)无法工作的原因可能是因为数据中还有其他字符。我可能会建议只关注(
而不是之前的空间:
select left(TimeZoneName, charindex('(', TimeZoneName + '(') - 1)