【问题标题】:How to use a TRIM function in SQL Server如何在 SQL Server 中使用 TRIM 函数
【发布时间】:2013-01-05 00:31:33
【问题描述】:

我无法让这个 TRIM 代码工作

SELECT 
   dbo.COL_V_Cost_GEMS_Detail.TNG_SYS_NR AS [EHP Code], 
   dbo.COL_TBL_VCOURSE.TNG_NA AS [Course Title], 
   LTRIM(RTRIM(FCT_TYP_CD)& ') AND (' & LTRIM(RTRIM(DEP_TYP_ID) & ')' AS [Course Owner]

【问题讨论】:

  • 你有什么问题?举例说明您正在获得什么以及您期望什么
  • 您遇到的错误是什么?什么风格的 SQL? MSFT、Oracle、DB2、MySQL 其他?
  • 我在 SQL Server 中遇到无法解析查询文本错误

标签: sql sql-server trim


【解决方案1】:

您缺少两个右括号...而且我不确定 & 符号是否可以用作字符串连接运算符。试试“+”

SELECT dbo.COL_V_Cost_GEMS_Detail.TNG_SYS_NR AS [EHP Code], 
dbo.COL_TBL_VCOURSE.TNG_NA AS [Course Title], 
LTRIM(RTRIM(FCT_TYP_CD)) + ') AND (' + LTRIM(RTRIM(DEP_TYP_ID)) + ')' AS [Course Owner]

【讨论】:

【解决方案2】:

TRIM 所有SPACETABENTER 的:

DECLARE @Str VARCHAR(MAX) = '      
          [         Foo    ]       
          '

DECLARE @NewStr VARCHAR(MAX) = ''
DECLARE @WhiteChars VARCHAR(4) =
      CHAR(13) + CHAR(10) -- ENTER
    + CHAR(9) -- TAB
    + ' ' -- SPACE

;WITH Split(Chr, Pos) AS (
    SELECT
          SUBSTRING(@Str, 1, 1) AS Chr
        , 1 AS Pos
    UNION ALL
    SELECT
          SUBSTRING(@Str, Pos, 1) AS Chr
        , Pos + 1 AS Pos
    FROM Split
    WHERE Pos <= LEN(@Str)
)
SELECT @NewStr = @NewStr + Chr
FROM Split
WHERE
    Pos >= (
        SELECT MIN(Pos)
        FROM Split
        WHERE CHARINDEX(Chr, @WhiteChars) = 0
    )
    AND Pos <= (
        SELECT MAX(Pos)
        FROM Split
        WHERE CHARINDEX(Chr, @WhiteChars) = 0
    )

SELECT '"' + @NewStr + '"'

作为函数

CREATE FUNCTION StrTrim(@Str VARCHAR(MAX)) RETURNS VARCHAR(MAX) BEGIN
    DECLARE @NewStr VARCHAR(MAX) = NULL

    IF (@Str IS NOT NULL) BEGIN
        SET @NewStr = ''

        DECLARE @WhiteChars VARCHAR(4) =
              CHAR(13) + CHAR(10) -- ENTER
            + CHAR(9) -- TAB
            + ' ' -- SPACE

        IF (@Str LIKE ('%[' + @WhiteChars + ']%')) BEGIN

            ;WITH Split(Chr, Pos) AS (
                SELECT
                      SUBSTRING(@Str, 1, 1) AS Chr
                    , 1 AS Pos
                UNION ALL
                SELECT
                      SUBSTRING(@Str, Pos, 1) AS Chr
                    , Pos + 1 AS Pos
                FROM Split
                WHERE Pos <= LEN(@Str)
            )
            SELECT @NewStr = @NewStr + Chr
            FROM Split
            WHERE
                Pos >= (
                    SELECT MIN(Pos)
                    FROM Split
                    WHERE CHARINDEX(Chr, @WhiteChars) = 0
                )
                AND Pos <= (
                    SELECT MAX(Pos)
                    FROM Split
                    WHERE CHARINDEX(Chr, @WhiteChars) = 0
                )
        END
    END

    RETURN @NewStr
END

示例

-- Test
DECLARE @Str VARCHAR(MAX) = '      
          [         Foo    ]       
              '

SELECT 'Str', '"' + dbo.StrTrim(@Str) + '"'
UNION SELECT 'EMPTY', '"' + dbo.StrTrim('') + '"'
UNION SELECT 'EMTPY', '"' + dbo.StrTrim('      ') + '"'
UNION SELECT 'NULL', '"' + dbo.StrTrim(NULL) + '"'

结果

+-------+----------------+
| Test  | Result         |
+-------+----------------+
| EMPTY | ""             |
| EMTPY | ""             |
| NULL  | NULL           |
| Str   | "[   Foo    ]" |
+-------+----------------+

【讨论】:

  • 这将替换所有嵌入的选项卡、cr 和 lf。修剪通常只是删除前导和尾随。
【解决方案3】:
LTRIM(RTRIM(FCT_TYP_CD)) & ') AND (' & LTRIM(RTRIM(DEP_TYP_ID)) & ')'

我认为您在两个装饰上都缺少)。一些 SQL 版本只支持 TRIM,它同时进行 L 和 R 修剪...

【讨论】:

    【解决方案4】:

    例子:

    DECLARE @Str NVARCHAR(MAX) = N'
                foo   bar
            Foo           Bar        
    
    '
    
    PRINT '[' + @Str + ']'
    
    DECLARE @StrPrv NVARCHAR(MAX) = N''
    
    WHILE ((@StrPrv <> @Str) AND (@Str IS NOT NULL)) BEGIN
        SET @StrPrv = @Str
    
        -- Beginning
        IF EXISTS (SELECT 1 WHERE @Str LIKE '[' + CHAR(13) + CHAR(10) + CHAR(9) + ']%')
            SET @Str = LTRIM(RIGHT(@Str, LEN(@Str) - 1))
    
        -- Ending
        IF EXISTS (SELECT 1 WHERE @Str LIKE '%[' + CHAR(13) + CHAR(10) + CHAR(9) + ']')
            SET @Str = RTRIM(LEFT(@Str, LEN(@Str) - 1))
    END
    
    PRINT '[' + @Str + ']'
    

    结果

    [
                foo   bar
            Foo           Bar        
    
    ]
    [foo   bar
            Foo           Bar]
    

    使用 fnTrim

    来源:https://github.com/reduardo7/fnTrim

    SELECT dbo.fnTrim(colName)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多