【发布时间】:2019-11-19 17:24:39
【问题描述】:
我有一个包含 City、State Zip 和 Country 的字符串。我已经能够将城市和州从字符串中提取到单独的列中,但是在提取邮政编码时遇到了问题。这是我从中提取的数据的示例。
哥伦布,俄亥俄州 43219,美国
我试过的代码是这样的
Replace(LTRIM(RTRIM(LEFT(C.[BILLING_CITYSTATEZIP], CHARINDEX(',', C.[BILLING_CITYSTATEZIP])))),',','')as City,
left(LTRIM(RTRIM(SUBSTRING(C.[BILLING_CITYSTATEZIP], CHARINDEX(',', C.[BILLING_CITYSTATEZIP])+1, LEN(C.[BILLING_CITYSTATEZIP])-(CHARINDEX('', C.[BILLING_CITYSTATEZIP])-1)))),2)as State,
dbo.udf_GetNumeric(Right(LTRIM(RTRIM(Substring(C.[BILLING_CITYSTATEZIP], CHARINDEX(',', C.[BILLING_CITYSTATEZIP])+1, LEN(C.[BILLING_CITYSTATEZIP])-(CHARINDEX('',C.[BILLING_CITYSTATEZIP]-1)))),2))as Zip,
我包含了用于提取城市和州的代码,因为我将邮政编码的行从州行镜像,但我不断收到以下错误。我无法弄清楚我在哪里错过了 ltrim 的论点。任何的建议都受欢迎。
消息 174,级别 15,状态 1,第 36 行 ltrim 函数需要 1 个参数。 消息 102,第 15 级,状态 1,第 52 行 ',' 附近的语法不正确。
【问题讨论】:
-
试试
dbo.udf_GetNumeric(Right(LTRIM(RTRIM(Substring(C.[BILLING_CITYSTATEZIP], CHARINDEX(',', C.[BILLING_CITYSTATEZIP])+1, LEN(C.[BILLING_CITYSTATEZIP])-(CHARINDEX('', C.[BILLING_CITYSTATEZIP])-1)))),2))as Zip, -
注意 udf_getnumeric 函数,因为某些州的邮政编码中有前导 0。
-
这只是一个语法错误。你在最后缺少一个右括号。但希望您能够修复设计,而不是将所有这些数据存储在同一个元组中。你发现它很痛苦,它也违反了 1NF。
-
感谢您的提醒!我会记住这一点的。
-
@NewCoder04 1NF= 第一范式,您应该对存储在数据库中的所有数据执行此操作。有这样的字符串通常被认为是糟糕的设计,然后你需要将它“转换”为你可以使用的东西......
标签: sql-server tsql substring