SQL Server 替换,删除特定字符后的所有内容
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/1668014/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
SQL Server replace, remove all after certain character
提问by Jimmy
My data looks like
我的数据看起来像
ID MyText
1 some text; some more text
2 text again; even more text
How can I update MyText to drop everything after the semi-colon and including the semi colon, so I'm left with the following:
如何更新 MyText 以删除分号之后的所有内容并包括分号,所以我只剩下以下内容:
ID MyText
1 some text
2 text again
I've looked at SQL Server Replace, but can't think of a viable way of checking for the ";"
我看过SQL Server Replace,但想不出一种可行的方法来检查“;”
回答by Paul Williams
Use LEFT combined with CHARINDEX:
将 LEFT 与 CHARINDEX 结合使用:
UPDATE MyTable
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
Note that the WHERE clause skips updating rows in which there is no semicolon.
请注意,WHERE 子句会跳过更新没有分号的行。
Here is some code to verify the SQL above works:
下面是一些验证上述 SQL 工作的代码:
declare @MyTable table ([id] int primary key clustered, MyText varchar(100))
insert into @MyTable ([id], MyText)
select 1, 'some text; some more text'
union all select 2, 'text again; even more text'
union all select 3, 'text without a semicolon'
union all select 4, null -- test NULLs
union all select 5, '' -- test empty string
union all select 6, 'test 3 semicolons; second part; third part;'
union all select 7, ';' -- test semicolon by itself
UPDATE @MyTable
SET MyText = LEFT(MyText, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
select * from @MyTable
I get the following results:
我得到以下结果:
id MyText
-- -------------------------
1 some text
2 text again
3 text without a semicolon
4 NULL
5 (empty string)
6 test 3 semicolons
7 (empty string)
回答by Rashlien
For the times when some fields have a ";" and some do not you can also add a semi-colon to the field and use the same method described.
对于某些字段有“;”的时候 有些没有,您还可以在字段中添加分号并使用所描述的相同方法。
SET MyText = LEFT(MyText+';', CHARINDEX(';',MyText+';')-1)
回答by Rookie
Could use CASE WHEN
to leave those with no ';' alone.
可以CASE WHEN
用来离开那些没有';' 独自的。
SELECT
CASE WHEN CHARINDEX(';', MyText) > 0 THEN
LEFT(MyText, CHARINDEX(';', MyText)-1) ELSE
MyText END
FROM MyTable
回答by David
Use CHARINDEX
to find the ";". Then use SUBSTRING
to just return the part before the ";".
使用CHARINDEX
找到“;”。然后用于SUBSTRING
仅返回“;”之前的部分。
回答by manji
UPDATE MyTable
SET MyText = SUBSTRING(MyText, 1, CHARINDEX(';', MyText) - 1)
WHERE CHARINDEX(';', MyText) > 0
回答by gotqn
For situations when I need to replace or match(find) something against string I prefer using regular expressions.
对于需要替换或匹配(查找)字符串的情况,我更喜欢使用正则表达式。
Since, the regular expressions are not fully supported in T-SQL
you can implement them using CLR
functions. Furthermore, you do not need any C#
or CLR
knowledge at all as all you need is already available in the MSDN String Utility Functions Sample.
由于不完全支持正则表达式,T-SQL
您可以使用CLR
函数来实现它们。此外,您根本不需要任何知识C#
或CLR
知识,因为您需要的所有内容都已在 MSDN字符串实用程序函数示例 中可用。
In your case, the solution using regular expressions is:
在您的情况下,使用正则表达式的解决方案是:
SELECT [dbo].[RegexReplace] ([MyColumn], '(;.*)', '')
FROM [dbo].[MyTable]
But implementing such function in your database is going to help you solving more complex issues at all.
但是在您的数据库中实现这样的功能将帮助您解决更复杂的问题。
The example below shows how to deploy only the [dbo].[RegexReplace]
function, but I will recommend to you to deploy the whole String Utility
class.
下面的例子展示了如何只部署[dbo].[RegexReplace]
函数,但我会建议你部署整个String Utility
类。
Enabling CLR Integration. Execute the following Transact-SQL commands:
sp_configure 'clr enabled', 1 GO RECONFIGURE GO
Bulding the code (or creating the
.dll
). Generraly, you can do this using the Visual Studio or .NET Framework command prompt (as it is shown in the article), but I prefer to use visual studio.create new class library project:
copy and paste the following code in the
Class1.cs
file:using System; using System.IO; using System.Data.SqlTypes; using System.Text.RegularExpressions; using Microsoft.SqlServer.Server; public sealed class RegularExpression { public static string Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement) { string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value; string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value; string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value; return Regex.Replace(input, pattern, replacement); } }
build the solution and get the path to the created
.dll
file:replace the path to the
.dll
file in the followingT-SQL
statements and execute them:IF OBJECT_ID(N'RegexReplace', N'FS') is not null DROP Function RegexReplace; GO IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'StringUtils') DROP ASSEMBLY StringUtils; GO DECLARE @SamplePath nvarchar(1024) -- You will need to modify the value of the this variable if you have installed the sample someplace other than the default location. Set @SamplePath = 'C:\Users\gotqn\Desktop\StringUtils\StringUtils\StringUtils\bin\Debug\' CREATE ASSEMBLY [StringUtils] FROM @SamplePath + 'StringUtils.dll' WITH permission_set = Safe; GO CREATE FUNCTION [RegexReplace] (@input nvarchar(max), @pattern nvarchar(max), @replacement nvarchar(max)) RETURNS nvarchar(max) AS EXTERNAL NAME [StringUtils].[RegularExpression].[Replace] GO
That's it. Test your function:
declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) insert into @MyTable ([id], MyText) select 1, 'some text; some more text' union all select 2, 'text again; even more text' union all select 3, 'text without a semicolon' union all select 4, null -- test NULLs union all select 5, '' -- test empty string union all select 6, 'test 3 semicolons; second part; third part' union all select 7, ';' -- test semicolon by itself SELECT [dbo].[RegexReplace] ([MyText], '(;.*)', '') FROM @MyTable select * from @MyTable
启用 CLR 集成。执行以下 Transact-SQL 命令:
sp_configure 'clr enabled', 1 GO RECONFIGURE GO
构建代码(或创建
.dll
)。通常,您可以使用 Visual Studio 或 .NET Framework 命令提示符(如文章中所示)执行此操作,但我更喜欢使用 Visual Studio。创建新的类库项目:
将以下代码复制并粘贴到
Class1.cs
文件中:using System; using System.IO; using System.Data.SqlTypes; using System.Text.RegularExpressions; using Microsoft.SqlServer.Server; public sealed class RegularExpression { public static string Replace(SqlString sqlInput, SqlString sqlPattern, SqlString sqlReplacement) { string input = (sqlInput.IsNull) ? string.Empty : sqlInput.Value; string pattern = (sqlPattern.IsNull) ? string.Empty : sqlPattern.Value; string replacement = (sqlReplacement.IsNull) ? string.Empty : sqlReplacement.Value; return Regex.Replace(input, pattern, replacement); } }
构建解决方案并获取创建
.dll
文件的路径:替换
.dll
以下T-SQL
语句中的文件路径并执行它们:IF OBJECT_ID(N'RegexReplace', N'FS') is not null DROP Function RegexReplace; GO IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'StringUtils') DROP ASSEMBLY StringUtils; GO DECLARE @SamplePath nvarchar(1024) -- You will need to modify the value of the this variable if you have installed the sample someplace other than the default location. Set @SamplePath = 'C:\Users\gotqn\Desktop\StringUtils\StringUtils\StringUtils\bin\Debug\' CREATE ASSEMBLY [StringUtils] FROM @SamplePath + 'StringUtils.dll' WITH permission_set = Safe; GO CREATE FUNCTION [RegexReplace] (@input nvarchar(max), @pattern nvarchar(max), @replacement nvarchar(max)) RETURNS nvarchar(max) AS EXTERNAL NAME [StringUtils].[RegularExpression].[Replace] GO
就是这样。测试你的功能:
declare @MyTable table ([id] int primary key clustered, MyText varchar(100)) insert into @MyTable ([id], MyText) select 1, 'some text; some more text' union all select 2, 'text again; even more text' union all select 3, 'text without a semicolon' union all select 4, null -- test NULLs union all select 5, '' -- test empty string union all select 6, 'test 3 semicolons; second part; third part' union all select 7, ';' -- test semicolon by itself SELECT [dbo].[RegexReplace] ([MyText], '(;.*)', '') FROM @MyTable select * from @MyTable