0

我有一张如下表UtilityPin

UtilityID   PinType    PinValue     PinLatitude  PinLongitude
---------------------------------------------------------------
ABC         Zip        90222-3804   33.903808   -118.240723
ABC         Zip        90230-4313   34.008245   -118.388507
ABC         Zip        90230-4941   34.003206   -118.396149
ABC         Zip        90230        34.001654   -118.395662

现在该PinValue列包含Zip-Zip4一个区域的值,我想从中提取Zip Zip4,当Zip4行不存在时,格式Zip没有连字符,如最后一行所示,这意味着Zip4必须为空白。

因此,在研究和查看了一些这样的 Stack 问题之后,我最终得到了以下查询:

Select
    Zip = CASE WHEN CHARINDEX('-', h.PinValue) >0 THEN  SUBSTRING(h.PinValue, 0, CHARINDEX('-', h.PinValue)) ELSE h.PinValue END,
    Zip4 = CASE WHEN CHARINDEX('-', h.PinValue) >0 THEN SUBSTRING(h.PinValue, CHARINDEX('-', h.PinValue) + 1, LEN(h.PinValue) - CHARINDEX('-', h.PinValue)) 
    ELSE '' END
FROM 
    UtilityPin h
WHERE 
h.UtilityID ='ABC'  

哪个工作正常并给出我想要的结果,但正如您在上面的查询中看到的那样,我必须检查是否存在-两次PinValue,这是执行冗余操作,因为我必须将它分成两列ZipZip4。基本上我想要这样的东西:

--this query gives an error
Select 
    CASE WHEN CHARINDEX('-', h.PinValue) >0
    THEN
        SUBSTRING(h.PinValue, 0, CHARINDEX('-', h.PinValue)) AS Zip, 
        SUBSTRING(h.PinValue, CHARINDEX('-', h.PinValue) + 1, LEN(h.PinValue) - CHARINDEX('-', h.PinValue)) AS Zip4 
    ELSE
        h.PinValue AS Zip, 
        '' AS Zip4 
from 
    UtilityPin h
WHERE 
    h.PinType ='ABC'

所以我只会检查一次-PinValue但上面的查询给出了错误,我也使用过IF..ElSE,但它给出了错误。

任何建议都非常感谢。

4

1 回答 1

1

如果我没记错 zip 格式是固定的,那么你可以这样做

SELECT LEFT(PinValue, 5) Zip,
       CASE WHEN LEN(PinValue) = 10 THEN RIGHT(PinValue, 4) END Zip4
  FROM UtilityPin
 WHERE UtilityID ='ABC'

甚至

SELECT LEFT(PinValue, 5) Zip,
       SUBSTRING(PinValue, 7, 4) Zip4
  FROM UtilityPin
 WHERE UtilityID ='ABC'

注意:在第二个查询中,如果值不包含最后四位数字,您将得到一个空字符串而不是NULLin 。zip4您可以使用NULLIF()或来解决此问题COALESCE()

样本输出:

| 邮编 | 邮编4 |
|-------|--------|
| 90222 | 3804 |
| 90230 | 4313 |
| 90230 | 4941 |
| 90230 | (空) |

这是两个查询的SQLFiddle演示

于 2013-09-15T09:46:29.990 回答