如何删除表中特定列的前几个字符?


162

在SQL中,如何删除表中特定列的值的前4个字符?列名是Student Code,示例值是ABCD123Stu1231。我想从我的表格中删除所有记录的前4个字符

请指导我

Answers:


259
SELECT RIGHT(MyColumn, LEN(MyColumn) - 4) AS MyTrimmedColumn

编辑:要说明,RIGHT接受2个参数-要操作的字符串(或列),以及要返回的字符数(从字符串的“右侧”开始)。LEN返回列数据的长度,我们减去4,以便我们的RIGHT函数将最左边的4个字符留在“后面”。

希望这是有道理的。

再次编辑-我刚刚阅读了安德鲁的回答,他很可能正确地理解了我的观点,并且我可能会误会。如果是这种情况(并且您想更新表而不是仅仅返回篡改的结果),则可以执行以下操作:

UPDATE MyTable
SET MyColumn = RIGHT(MyColumn, LEN(MyColumn) - 4)

他走在正确的轨道上,但是他的解决方案将4个字符保留在字符串的开头,而不是丢弃所述4个字符。


9
对于<4个字符的值,这将失败。您应该添加一个case块为<4.返回列的值
斯科特艾维

2
可能最好的处理方法是:UPDATE MyTableSET MyColumn = RIGHT(MyColumn,LEN(MyColumn)-4)WHERE LEN(MyColumn)> 4 SUBSTRING不会出错,但也会不必要地“更新”行少于四个字符。就是说,OP表示他们想修剪特定列的前4个字符-除非提供了更多详细信息,否则我想假设所有行都需要修剪。
亚伦·奥尔顿

1
@ spencer7593-哈哈哈...是的。您始终可以添加WHERE子句以确保安全:WHERE NOT ISNUMERIC(LEFT(MyColumn,1))
Aaron Alton

在NULL列上调用此方法安全吗?在这种情况下会发生吗?
伊恩·奥布莱恩

我最终使用COL_LENGTH('MyTable', 'MyColumn')而不是,LEN(MyColumn)因为在我的情况下,无论列中实际内容的大小如何,我都希望排除前n个字符,但是除此以外,它还不错!
sfarbota

86
Stuff(someColumn, 1, 4, '')

这表示从第一个1字符位置开始,4什么都不要替换字符''


7
我知道一个老问题,但是我更喜欢这种解决方案,因为它不使用1个以上的函数,也没有随机数。
Edwin Stoteler

4
甚至更多:如果someColumn是复杂的事情,例如来自CTE的子选择或其他操作,则不需要对其进行两次评估。
杰夫

1
仅供参考,该解决方案对于修剪数值也非常有效。
史蒂文·波尔

1
为了增强您所说的内容,这是一个完整的结果。首先,进行选择,确保您获得所需的行,然后在此更新中正确进行。注意/当心-成功运行后不要再运行它,因为它会不加选择地截断前4个字符:更新表集textField =(SELECT STUFF(CONVERT(VARCHAR(MAX),textField),1,4,''))其中activitytype ='A'并已批准日期>'2017-06-30'并且textField不喜欢'%The County1%'和textField不喜欢'%The County2%'和abstract不喜欢'%The County3%')和activityid在(12345,... ID范围... 56789)
dcparham

33

为什么要使用LEN,所以您有2个字符串函数?您需要的只是角色5的...

...SUBSTRING (Code1, 5, 8000)...

1
这是未来的证明吗?将来的MSSQL版本是否可能使用大于8,000的最大varchar大小?
Developer Webs

3
varchar(max)已经大于8000个字符。如果你把LEN(列),它会永远虽然工作
Gaspa79

2
或者只使用2000000000。为什么要添加LEN函数。不添加任何值,并且也忽略尾随空格(如果需要的话)
gbn

1
谢谢,这对我来说是一次性的。可以接受的答案是由于某些原因在某些情况下会切掉其他字符,但这是完美的。
user2366842

2
@ user2366842使用接受的答案会截断其他字符的可能原因是您的文本中可能带有尾随空格。如果需要,您可以使用RTRIM和LTRIM进行补偿。
Spazmoose

13

试试这个:

update table YourTable
set YourField = substring(YourField, 5, len(YourField)-3);

7

这是您想要做的一个简单的模型:)

CREATE TABLE Codes
(
code1 varchar(10),
code2 varchar(10)
)

INSERT INTO Codes (CODE1, CODE2) vALUES ('ABCD1234','')


UPDATE Codes
SET code2 = SUBSTRING(Code1, 5, LEN(CODE1) -4)

因此,对要修剪的字段使用最后一条语句:)

SUBSTRING函数将修整Code1,从第FIFTH个字符开始,并继续将CODE1的长度减去4(开始时跳过的字符数)。


5

完整的东西

DECLARE @v varchar(10)

SET @v='#temp'

select STUFF(@v, 1, 1, '')
WHERE LEFT(@v,1)='#'

3

您也可以在SQL中执行此操作。

substring(StudentCode,4,len(StudentCode))

句法

substring (ColumnName,<Number of starting Character which u want to remove>,<length of given string>)

3

试试这个。100%工作

UPDATE Table_Name
SET RIGHT(column_name, LEN(column_name) - 1)

  


3

当值的长度可能小于4时,最合适的答案不合适。

在T-SQL中

您将获得“无效的长度参数传递给正确的函数”,因为它不接受负数。使用CASE语句:

SELECT case when len(foo) >= 4 then RIGHT(foo, LEN(foo) - 4) else '' end AS myfoo from mytable;

在Postgres

小于4的值在下面给出了令人惊讶的行为,而不是错误,因为将负值传递给RIGHT会修剪第一个字符而不是整个字符串。改为使用它更有意义RIGHT(MyColumn, -5)

比较使用最高答案的“长度-5”而不是“ -5”时得到的结果的示例:

create temp table foo (foo) as values ('123456789'),('12345678'),('1234567'),('123456'),('12345'),('1234'),('123'),('12'),('1'), ('');

select foo, right(foo, length(foo) - 5), right(foo, -5) from foo;

foo       len(foo) - 5  just -5   
--------- ------------  -------     
123456789 6789          6789 
12345678  678           678  
1234567   67            67   
123456    6             6    
12345                       
1234      234               
123       3                 
12                          
1                           

1
您使用什么数据库?该问题带有tsql标记,但是T-SQL不允许使用负参数。我收到错误消息“无效的长度参数传递给正确的函数。”
帕洛塔

我没有注意到标签。将答案分为T-SQL和Postgres部分。谢谢。
Noumenon



1

如果您必须删除前面的特殊字符(如)前面的几个字符#,这是一个很好的选择:

UPDATE tblInvalidID
SET [ColumnName] =stuff(ColumnName, 1, charindex('#', ColumnName), ' ') 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.