我有一张如下表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
,这是执行冗余操作,因为我必须将它分成两列Zip
和Zip4
。基本上我想要这样的东西:
--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
,但它给出了错误。
任何建议都非常感谢。