TSQL 中左修剪换行符

Spe*_*ius 6 t-sql newline trim

我尝试在 tsql 中保留换行符。所以我想删除字段中数据的前导 CHAR(13) + CHAR(10)。并确保其他换行符不会被删除。

我的意思是:

'
Kanne Oliver
Rosa-Luxemburg-Str. 3
07817 Alton ( Elster)'
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

'Kanne Oliver
Rosa-Luxemburg-Str. 3
07817 Alton ( Elster)'
Run Code Online (Sandbox Code Playgroud)

先谢谢了

Dav*_*son 8

在这个非常具体的示例中,可以使用SQL Server 2017 的TRIM()函数。它将字符串开头和结尾的字符删除为文本。默认情况下仅TRIM删除空格CHAR(32)字符。在这里,将指定要删除的字符(CR 和 LF):

SELECT TRIM( CHAR(13) + CHAR(10) FROM '
Kanne Oliver
Rosa-Luxemburg-Str. 3
07817 Alton ( Elster)');
Run Code Online (Sandbox Code Playgroud)

注意:在 SQL Server Management Studio 中,将“查询结果设置为文本”(CTRL + T) 将有助于有效地查看结果:

---------------------------------------------------------------
Kanne Oliver
Rosa-Luxemburg-Str. 3
07817 Alton ( Elster)

(1 row affected)
Run Code Online (Sandbox Code Playgroud)

另请注意,如果文本字符串末尾有任何 CR 或 LF 字符,这些字符也会被删除。不幸的是,RTRIM仍然LTRIM仅适用于空格字符(截至 SQL 2017)。


Ser*_*ton 5

如果数据的每一行开头都有 CR LF,只需将它们从行中删除

SELECT SUBSTRING(3, LEN(field)) field
FROM   Table
Run Code Online (Sandbox Code Playgroud)

否则,如果不是所有行都以 CR LF 开头,您需要从中检查

SELECT CASE WHEN CHAR(13) + CHAR(10) = LEFT(field, 2)
            THEN SUBSTRING(field, 3, LEN(field))
            ELSE field
       END
FROM   Table
Run Code Online (Sandbox Code Playgroud)

在此之前的查询只会删除第一个 CR LF,要删除任意数量的它们,可以使用递归CTE

WITH S AS (
  SELECT sentence 
       = CASE WHEN char(13) + char(10) = LEFT(sentence, 2) 
              THEN SUBSTRING(sentence, 3, LEN(sentence))
              ELSE sentence
         END
  FROM   Test
  UNION ALL
  SELECT sentence = SUBSTRING(sentence, 3, LEN(sentence))
  FROM   S
  WHERE  char(13) + char(10) = LEFT(sentence, 2)
)
select Sentence
FROM   S
WHERE  char(13) + char(10) <> LEFT(sentence, 2)
Run Code Online (Sandbox Code Playgroud)

或者,正如 Filip De Vos 在评论中指出的那样,搜索第一个不是 CR LF 的字符

SELECT SUBSTRING(sentence
               , PATINDEX('%[^' + char(13) + char(10) + ']%', sentence)
               , LEN(sentence))
FROM   test
Run Code Online (Sandbox Code Playgroud)

包含两个查询的SQLFiddle 演示


Sta*_*ace -3

Transact-SQL 中的 RTRIM 函数在截断所有尾随空格后返回字符串,而 LTRIM 在删除前导空格后返回字符表达式。

因此,要从字符串中删除前导或尾随空格,您可以编写如下:

SELECT RTRIM(LTRIM(YourColumnName)) AS FirstName FROM [dbo].[StaffInformation]
Run Code Online (Sandbox Code Playgroud)