如何删除SQL Server中的前导和尾随引号?

问题描述:

我有一个NTEXT列SQL Server数据库中的表。此列可能包含用双引号括起来的数据。当我查询这一列时,我想删除这些前导和尾随引号。如何删除SQL Server中的前导和尾随引号?

例如:

“这是一封测试邮件”

应该成为

这是一封测试邮件

我知道的LTRIM和RTRIM函数,但这些工作只适用于空间。任何关于我可以用来实现这个功能的建议。

+0

您使用的是哪个版本的SQL Server? – 2009-06-30 21:31:41

+0

SQL Server 2005 – adeel825 2009-06-30 23:42:36

,你可以用一个空字符串替换引号...

SELECT AllRemoved = REPLACE(CAST(MyColumn AS varchar(max)), '"', ''), 
     LeadingAndTrailingRemoved = CASE 
      WHEN MyTest like '"%"' THEN SUBSTRING(Mytest, 2, LEN(CAST(MyTest AS nvarchar(max)))-2) 
      ELSE MyTest 
      END 
FROM MyTable 
+0

在字符串内可能有引号,我不想删除这些 - 只是引导和尾随引号。 – adeel825 2009-06-30 21:24:19

+0

更新了一个case语句的例子,当两者都存在时删除前导和尾随。 – 2009-06-30 21:29:47

我刚刚测试此代码在MS SQL 2008和验证它。

删除最左边的报价:

UPDATE MyTable 
SET FieldName = SUBSTRING(FieldName, 2, LEN(FieldName)) 
WHERE LEFT(FieldName, 1) = '"' 

删除最右边的报价:(修订避免隐式类型转换误差为int)

UPDATE MyTable 
SET FieldName = SUBSTRING(FieldName, 1, LEN(FieldName)-1) 
WHERE RIGHT(FieldName, 1) = '"' 
+0

这是正确的,你也可以使用LEFT和RIGHT funcions。 – tekBlues 2009-06-30 21:28:53

+1

ntext列,所以LEN,LEFT&RIGHT将不起作用。您应该改为DataLength和SubString。 – 2009-06-30 21:29:48

+0

SUBSTRING是SQL Server中的功能。不是SUBSTR – Keltex 2010-09-11 18:30:23

你可以试试这个 -

SELECT left(right(cast(SampleText as nVarchar),LEN(cast(sampleText as nVarchar))-1),LEN(cast(sampleText as nVarchar))-2) 
    FROM TableName 

欢呼声

我认为这是一个简单的脚本,如果你想删除所有报价

UPDATE Table_Name 
SET col_name = REPLACE(col_name, '"', '') 

我知道这是一个老问题的帖子,但我的女儿来到了我的问题,并引用此页面有可能的答案。鉴于她正在为此寻找答案,这是一个安全的假设,其他人可能仍然如此。

所有这些都是非常好的方法,并且所有的东西都有很多方式可以让猫变得像皮肤一样。

如果你正在寻找一个左修剪一个字符或字符串的正确修剪,您的尾随字符/字符串长度一致,这是我的建议:

SELECT SUBSTRING(ColName,VAR, LEN(ColName)-VAR) 

或者在这个问题上...

SELECT SUBSTRING('"this is a test message"',2, LEN('"this is a test message"')-2) 

有了这个,你只需调整SUBSTRING起点(2),和LEN位置(-2),以你需要从字符串中删除任何值。

这是非迭代的,不需要明确的案例测试,最重要的是它是内联所有这些都是一个更清晰的执行计划。

CREATE FUNCTION dbo.TRIM(@String VARCHAR(MAX), @Char varchar(5)) 
RETURNS VARCHAR(MAX) 
BEGIN 
RETURN SUBSTRING(@String,PATINDEX('%[^' + @Char + ' ]%',@String) 
    ,(DATALENGTH(@String)+2 - (PATINDEX('%[^' + @Char + ' ]%' 
    ,REVERSE(@String)) + PATINDEX('%[^' + @Char + ' ]%',@String) 
    ))) 
END 
GO 

Select dbo.TRIM('"this is a test message"','"') 

参考:http://raresql.com/2013/05/20/sql-server-trim-how-to-remove-leading-and-trailing-charactersspaces-from-string/

您可以简单地使用SQL Server中的 “替换” 功能。

这样的:

select REPLACE('this is a test message','"','') 

注:第二个参数这里是“双引号”两个单引号内,第三个参数是简单的两个单引号的组合。这里的想法是用空白替换双引号。

非常简单和易于执行!

如果调用表[Messages]并且该列名为[Description],那么以下脚本仅从列值左右移除引号。

-- If the content is in the form of "anything" (LIKE '"%"') 
-- Then take the whole text without the first and last characters 
-- (from the 2nd character and the LEN([Description]) - 2th character) 

UPDATE [Messages] 
SET [Description] = SUBSTRING([Description], 2, LEN([Description]) - 2) 
WHERE [Description] LIKE '"%"' 

我的解决办法是使用差在所述列中的值的长度进行比较的相同列的长度,但是与用空格置换和修整,以便计算的开始和长度值作为一个SUBSTRING函数的参数的双引号。

这样做的好处是可以删除任何前导或尾随字符,即使它发生多次,同时留下文本中包含的任何字符。

这里是我的回答与一些测试数据:

SELECT 
    x AS before 
    ,SUBSTRING(x 
     ,LEN(x) - (LEN(LTRIM(REPLACE(x, '"', ' ')) + '|') - 1) + 1 --start_pos 
     ,LEN(LTRIM(REPLACE(x, '"', ' '))) --length 
     ) AS after 
FROM 
(
SELECT 'test'  AS x UNION ALL 
SELECT '"'  AS x UNION ALL 
SELECT '"test' AS x UNION ALL 
SELECT 'test"' AS x UNION ALL 
SELECT '"test"' AS x UNION ALL 
SELECT '""test' AS x UNION ALL 
SELECT 'test""' AS x UNION ALL 
SELECT '""test""' AS x UNION ALL 
SELECT '"te"st"' AS x UNION ALL 
SELECT 'te"st' AS x 
) a 

将会产生以下结果:

before after 
----------------- 
test test 
" 
"test test 
test" test 
"test" test 
""test test 
test"" test 
""test"" test 
"te"st" te"st 
te"st te"st 

有一点要注意的是越来越长的时候,我只需要使用LTRIM,而不是LTRIM和RTRIM相结合,这是因为LEN函数不计算尾随空格。

我用这个:

UPDATE DataImport 
SET PRIO = 
     CASE WHEN LEN(PRIO) < 2 
     THEN 
      (CASE PRIO WHEN '""' THEN '' ELSE PRIO END) 
     ELSE REPLACE(PRIO, '"' + SUBSTRING(PRIO, 2, LEN(PRIO) - 2) + '"', 
      SUBSTRING(PRIO, 2, LEN(PRIO) - 2)) 
     END 

要删除这两个报价,你可以做到这一点

SUBSTRING(fieldName, 2, lEN(fieldName) - 2) 

您可以分配或项目所产生的价值

您可以使用哪些工作下面的查询对我来说 -

For updating-

UPDATE table SET colName= REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') WHERE... 

对于selecting-

SELECT REPLACE(LTRIM(RTRIM(REPLACE(colName, '"', ''))), '', '"') FROM TableName 

一些UDF的重新可用性。

左修剪由字符(任何数字)

CREATE FUNCTION [dbo].[LTRIMCHAR] (@Input NVARCHAR(max), @TrimChar CHAR(1) = ',') 
RETURNS NVARCHAR(max) 
AS 
BEGIN 
     RETURN REPLACE(REPLACE(LTRIM(REPLACE(REPLACE(@Input,' ','¦'), @TrimChar, ' ')), ' ', @TrimChar),'¦',' ') 
END 

由字符右边修剪(任何数字)

CREATE FUNCTION [dbo].[RTRIMCHAR] (@Input NVARCHAR(max), @TrimChar CHAR(1) = ',') 
RETURNS NVARCHAR(max) 
AS 
BEGIN 
    RETURN REPLACE(REPLACE(RTRIM(REPLACE(REPLACE(@Input,' ','¦'), @TrimChar, ' ')), ' ', @TrimChar),'¦',' ') 
END 

注意哑字符 '|'(ALT + 0166)不能出现在数据(您可能希望测试您的输入字符串,首先,如果不确定或使用不同的字符)。