AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 137200
Accepted
GWR
GWR
Asked: 2016-05-03 04:12:13 +0800 CST2016-05-03 04:12:13 +0800 CST 2016-05-03 04:12:13 +0800 CST

修剪尾随空格、制表符、换行符、回车符等

  • 772

我正在使用 SQL Server 2008,我正在寻找一个类似的函数ltrim,rtrim它还将删除前导和尾随制表符、双空格、回车、换行等。

那里有许多函数,但我发现的函数都有限制,例如将字符串截断为 8000 个字符。例如(根据一些评论):

SQL SERVER – 2008 – 增强的 TRIM() 函数 – 删除尾随空格、前导空格、空格、制表符、回车、换行

其中一条评论提出了一个更好的解决方案,但- 1导致incorrect syntax错误,我不知道为什么。

CREATE FUNCTION dbo.SuperTrimLeft(@str varchar(MAX)) RETURNS varchar(MAX)
    AS
    BEGIN
    IF (ASCII(LEFT(@str, 1)) < 33) BEGIN
        SET @str = STUFF(@str, 1, PATINDEX('%[^'+CHAR(0)+'-'+CHAR(32)+']%', @str) – 1, ' ');
    END;

    RETURN @str;
END;

所以我的问题是,完成上述任务的最佳方法是什么?

sql-server functions
  • 4 4 个回答
  • 10350 Views

4 个回答

  • Voted
  1. Best Answer
    Martin Smith
    2016-05-03T04:39:26+08:002016-05-03T04:39:26+08:00

    最好的方法可能是创建一个 CLR 函数并使用 .NET 框架库。

    下面是 TSQL 尝试。

    DECLARE @Pattern NVARCHAR (50) = N'%[^' + 
    /*List from http://stackoverflow.com/a/18169122/73226 */
    NCHAR(0x0009) +  /*tab*/
    NCHAR(0x000A) +  /*line feed*/
    NCHAR(0x000B) +  /*line tabulation*/
    NCHAR(0x000C) +  /*form feed*/
    NCHAR(0x000D) +  /*carriage return*/
    /*Various spaces from https://www.cs.tut.fi/~jkorpela/chars/spaces.html */
    NCHAR(0x0020) +  
    NCHAR(0x00A0) +  
    NCHAR(0x1680) +  
    NCHAR(0x180E) +  
    NCHAR(0x2000) +  
    NCHAR(0x2001) +  
    NCHAR(0x2002) +  
    NCHAR(0x2003) +  
    NCHAR(0x2004) +  
    NCHAR(0x2005) +  
    NCHAR(0x2006) +  
    NCHAR(0x2007) +  
    NCHAR(0x2008) +  
    NCHAR(0x2009) +  
    NCHAR(0x200A) +  
    NCHAR(0x200B) +  
    NCHAR(0x202F) +  
    NCHAR(0x205F) +  
    NCHAR(0x3000) +  
    NCHAR(0xFEFF) +
    N']%' COLLATE Latin1_General_100_BIN2;
    
    WITH T(String) AS
    (
    SELECT '         leading only' union all
    SELECT '
    
    Line breaks
    
    ' union all
    SELECT '    tab and space    ' union all
    SELECT '' 
    )
    SELECT '[' + SUBSTRING(String,Start,len(String + '..') - Start - Finish) + ']'
    FROM T
    CROSS APPLY
    (
    SELECT  PATINDEX(@Pattern,String),
            PATINDEX(@Pattern,REVERSE(String))
    )ca(Start, Finish)
    

    应用和定界符只是为了[更]容易验证那里没有潜伏的空白。当您感到满意时,请移除这些。

    • 6
  2. Tom V
    2016-05-03T04:48:36+08:002016-05-03T04:48:36+08:00

    其中一条评论提出了一个更好的解决方案,但 - 1 会导致语法错误,我不知道为什么。

    因为您从网站复制粘贴,并且页面不显示连字符/减号,而是显示破折号。

    您只需将光标放在它后面并删除它,然后在键盘上输入减号,代码就会起作用。

    如果您想修改注释中的代码以执行正确的修剪方案,您可以像文章那样做,并创建一个只反转字符串两次的函数(从文章中复制代码但更改为 use SuperTrimLeft)。

    CREATE FUNCTION dbo.RTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
    AS
    BEGIN
    DECLARE @trimchars VARCHAR(10)
    SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
    IF @str LIKE '%[' + @trimchars + ']'
    SET @str = REVERSE(dbo.SuperTrimLeft(REVERSE(@str)))
    RETURN @str
    END
    GO
    CREATE FUNCTION dbo.TrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
    AS
    BEGIN
    RETURN dbo.SuperTrimLeft(dbo.RTrimX(@str))
    END
    GO
    
    • 4
  3. Gordon Bell
    2016-05-04T09:23:54+08:002016-05-04T09:23:54+08:00

    到目前为止给出的两个答案都需要至少一次反转字符串来解决右手边。

    这个方法不行。

    CREATE FUNCTION dbo.LTrimWhitespace(@Input VARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
        DECLARE @Output VARCHAR(MAX)
        DECLARE @Whitespace VARCHAR(20)
        DECLARE @Pos INT
    
        SET @Whitespace = CHAR(0) + CHAR(9) + CHAR(10) + CHAR(13) + CHAR(32)
        SET @Pos = 1
    
        WHILE CHARINDEX(SUBSTRING(@Input, @Pos, 1), @Whitespace) > 0
        BEGIN
            SET @Pos = @Pos + 1
        END
    
        SET @Output = RIGHT(@Input, LEN(@Input) - @Pos + 1)
    
        RETURN @Output
    END
    
    CREATE FUNCTION dbo.RTrimWhitespace(@Input VARCHAR(MAX))
    RETURNS VARCHAR(MAX)
    AS
    BEGIN
        DECLARE @Output VARCHAR(MAX)
        DECLARE @Whitespace VARCHAR(20)
        DECLARE @Pos INT
    
        SET @Whitespace = CHAR(0) + CHAR(9) + CHAR(10) + CHAR(13) + CHAR(32)
        SET @Pos = LEN(@Input)
    
        WHILE CHARINDEX(SUBSTRING(@Input, @Pos, 1), @Whitespace) > 0
        BEGIN
            SET @Pos = @Pos - 1
        END
    
        SET @Output = LEFT(@Input, @Pos)
    
        RETURN @Output
    END
    
    • 4
  4. JBress
    2022-03-31T22:38:05+08:002022-03-31T22:38:05+08:00

    接受的答案不处理仅包含换行符的字符串。

    根据 Martin 的解决方案,这是一个可以正确处理它的函数。

    -- Based on https://dba.stackexchange.com/questions/137200/trim-trailing-whitespace-tab-newline-carriage-returns-etc/137203#137203
    CREATE OR ALTER FUNCTION [dbo].[ufn_trim]
    (
        @text nvarchar(max)
    )
    RETURNS nvarchar(max)
    AS
    BEGIN
    
        DECLARE @pattern nvarchar(50) = 
            N'%[^'
    
            -- common white space
            + nchar(0x0009) -- tab
            + nchar(0x000a) -- line feed (lf)
            + nchar(0x000b) -- line tabulation
            + nchar(0x000c) -- form feed
            + nchar(0x000d) -- carriage return (cr)
            + nchar(0x0020) -- space (sp)
            + nchar(0x00a0) -- no-break space (nbsp)
    
            -- uncommon spaces
            --+ nchar(0x1680) -- ogham space mark
            --+ nchar(0x180e) -- mongolian vowel separator (mvs)
            --+ nchar(0x2000) -- en quad
            --+ nchar(0x2001) -- em quad
            --+ nchar(0x2002) -- en space
            --+ nchar(0x2003) -- em space
            --+ nchar(0x2004) -- three-per-em space
            --+ nchar(0x2005) -- four-per-em space
            --+ nchar(0x2006) -- six-per-em space
            --+ nchar(0x2007) -- figure space
            --+ nchar(0x2008) -- punctuation space
            --+ nchar(0x2009) -- thin space
            --+ nchar(0x200a) -- hair space
            --+ nchar(0x202f) -- narrow no-break space (nnbsp)
            --+ nchar(0x205f) -- medium mathematical space (mmsp)
            --+ nchar(0x3000) -- ideographic space
    
            + N']%' COLLATE latin1_general_100_bin2
        ;
    
        DECLARE 
            @start int = PATINDEX(@pattern, @text),
            @end int = PATINDEX(@pattern, REVERSE(@text))
            ;
    
        IF @start = 0
        BEGIN
            -- the string doesn't contain any non-space character
            RETURN '';
        END
    
        RETURN SUBSTRING(@text, @start, LEN(@text + '..') - @start - @end);
    END
    GO
    
    • 0

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve