【问题标题】:How can I remove leading and trailing quotes in SQL Server?如何删除 SQL Server 中的前导引号和尾引号?
【发布时间】:2009-06-30 21:20:23
【问题描述】:

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

例如:

“这是一条测试消息”

应该变成

这是一条测试消息

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

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?

标签: sql sql-server


【解决方案1】:

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

【讨论】:

  • ntext 列,因此 LEN、LEFT 和 RIGHT 不起作用。您应该改为改为 DataLength 和 SubString。
  • SUBSTRING 是 SQL Server 中的函数。不是 SUBSTR
  • 对于任何关注的人,您还可以为左引号设置 `WHERE FieldName LIKE '"%'。(反转右引号的通配符位置)
【解决方案2】:

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

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

【讨论】:

  • 他只要求删除前导和尾随引号,此解决方案替换所有引号...
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    像这样::

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

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

    非常简单易执行!

    【讨论】:

      【解决方案5】:

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

      所有方法都是很好的方法,就像所有方法一样,剥猫皮的方法和剥猫皮的方法一样多。

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

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

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

      【讨论】:

      • 也在寻找这个问题的答案,并且使用 mysql 我不得不用 LENGTH 替换 LEN,否则这个答案对我来说是完美的。
      【解决方案6】:

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

      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
      

      【讨论】:

      • 字符串中可能有引号,我不想删除这些 - 只是前导和尾随引号。
      • 将示例更新为 case 语句,以便在两者都存在时仅删除前导和尾随。
      【解决方案7】:

      如果表称为 [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 '"%"'
      

      【讨论】:

      • 对于 MySQL,将 LEN() 替换为 LENGTH()。
      【解决方案8】:

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

      为了更新-

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

      用于选择-

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

      【讨论】:

        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:
            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】:

              我用这个:

              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】:

                要删除两个引号,您可以这样做

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

                您可以分配或投影结果值

                【讨论】:

                  【解决方案14】:

                  试试这个:

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2023-03-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-10-19
                    • 2011-10-06
                    相关资源
                    最近更新 更多