我得到了一个意想不到的'结果与SQL Server 2012中的更新查询。 这就是我想要做的。
在由ID ','name
(例如258967,Sarah Jones)组成的专栏(IDENTIFIER)中,我必须填写其他两列:ID
和SELLER_NAME
。
原始列有一些值,末尾有空白,其余的没有:
'258967,Sarah Jones'
'98745,Richard James '
这是我正在执行的更新查询:
UPDATE SELLER
SET
IDENTIFIER = LTRIM(RTRIM(IDENTIFIER)),
ID = Left(IDENTIFIER , charindex(',', IDENTIFIER )-1),
SELLER_NAME = UPPER(RIGHT((IDENTIFIER ),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER )));
但我最后得到了错误的结果
258967,Sarah Jones 258967 SARAH JONES
98745,Richard James 98745 ICHARD JAMES
所有在末尾都有空白的名称也会发生同样的情况。在这一点上我想知道,如果我已经指定我想在IDENTIFIER的值的开头和结尾消除所有空白作为第一个动作,为什么系统更新ID和SELLER_NAMES然后执行此操作?
仅指定:IDENTIFIER列是卖家表的一部分,该表正在从另一个从Excel文件导入数据的人员进行更新。我收到这些值,我必须规范化信息。我只能阅读卖家表,在回答之前将其考虑在内
答案 0 :(得分:4)
试试这个,因为你的名字右侧有空格,所以它只会截断名字中的一个字符。所以只需要RTRIM(IDENTIFIER)
就可以了。
SELLER_NAME = UPPER(RIGHT((RTRIM(IDENTIFIER)),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER)));
答案 1 :(得分:1)
你的牌桌的设计违反了1NF,只不过是痛苦的。而不是做所有这些疯狂的字符串操作,你可以很容易地在这里利用PARSENAME。
with Something(SomeValue) as
(
select '258967,Sarah Jones' union all
select '98745,Richard James '
)
select *
, ltrim(rtrim(PARSENAME(replace(SomeValue, ',', '.'), 2)))
, ltrim(rtrim(PARSENAME(replace(SomeValue, ',', '.'), 1)))
from Something
答案 2 :(得分:0)
首先尝试修剪IDENTIFIER
SALLER_NAME = UPPER(RIGHT((RTRIM(IDENTIFIER),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER )));
答案 3 :(得分:0)
不使用Right()
,而是使用SubString()
。
这是一个例子。我试图单独展示每一步来说明
; WITH x (identifier) AS (
SELECT '258967,Sarah Jones'
UNION ALL
SELECT '98745,Richar James '
)
SELECT identifier
, CharIndex(',', identifier) As comma
, SubString(identifier, CharIndex(',', identifier) + 1, 1000) As name_only
, LTrim(RTrim(SubString(identifier, CharIndex(',', identifier) + 1, 1000))) As trimmed_name_only
FROM x
请注意,所使用的1000
应该是列定义的最大长度或更高,例如如果您的IDENTIFIER列是varchar(2000)
,那么请改用2,000。