charindex在一些字符串上工作而不是另一个字符串。为什么不一致?

时间:2017-04-17 18:46:07

标签: sql sql-server

所以我有一个包含不同时区字符串的表。 某些时区后面有括号,例如:

  1. 中部夏令时(北美)
  2. 山地标准时间(墨西哥)
  3. 所以我们想摆脱括号内的所有内容,我正在使用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
    

    现在我很困惑,为什么相同的代码适用于其中一个(墨西哥一个)而不是另一个(北美一个)? 数据来自同一个表,因此此列中的数据类型是相同的。

2 个答案:

答案 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)