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

时间:2009-06-30 21:20:24

标签: sql sql-server

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

例如:

“这是测试消息”

应该成为

这是测试消息

我知道LTRIM和RTRIM函数,但这些函数仅适用于空格。关于我可以使用哪些功能来实现这一目标的任何建议。

14 个答案:

答案 0 :(得分:53)

我刚刚在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) = '"'

答案 1 :(得分:25)

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

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

答案 2 :(得分:3)

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

所有这些都是很好的方法,就像所有东西一样,有很多方法可以让猫去皮,就像猫皮肤一样。

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

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)调整为需要从字符串中删除的任何值。

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

您可以在SQL Server中使用“替换”功能。

像这样::

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

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

非常简单易行!

答案 5 :(得分:2)

如果调用表[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 '"%"'

答案 6 :(得分:2)

我的解决方案是使用列值长度的差异比较相同的列长度,但将双引号替换为空格并进行修剪,以便将起始值和长度值计算为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函数不计算尾随空格。

答案 7 :(得分:2)

一些可重复使用的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)(您可能希望测试输入字符串,首先,如果不确定或使用其他字符)。

答案 8 :(得分:1)

您可以使用以下对我有用的查询 -

更新 -

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

选择 -

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

答案 9 :(得分:1)

您可以使用TRIM('"' FROM '"this "is" a test"')来返回:this "is" a test

答案 10 :(得分:0)

你可以试试这个 -

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

欢呼声

答案 11 :(得分:0)

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/

答案 12 :(得分:0)

我用这个:

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

答案 13 :(得分:0)

要删除这两个引号,您可以执行此操作

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

您可以分配或投影结果值