62

SQL查询字符串中的回车并最终删除回车

我在表格中有一些数据,并且在我不想要它们的地方有一些回车。我正在尝试编写一个查询来获取所有包含回车的字符串。

我试过这个

select * from Parameters
where Name LIKE '%"\n" %'

select * from Parameters
where Name LIKE '\r'

'

两者都是有效的 SQL,但没有返回我正在寻找的内容。我需要使用Like命令还是其他命令?如何让回车进入查询?

回车也不一定在行尾(可能在中间)。

4

10 回答 10

84

这会很慢,但如果是一次性的,请尝试...

select * from parameters where name like '%'+char(13)+'%' or name like '%'+char(10)+'%'

请注意,ANSI SQL 字符串连接运算符是“||”,因此可能需要:

select * from parameters where name like '%' || char(13) || '%' or name like '%' || char(10) || '%'
于 2009-08-26T20:18:24.497 回答
70

主要问题是删除 CR/LF。使用 replace 和 char 函数对我有用:

Select replace(replace(Name,char(10),''),char(13),'')

对于 Postgres 或 Oracle SQL,请改用 CHR 函数:

       replace(replace(Name,CHR(10),''),CHR(13),'')
于 2012-09-21T13:41:57.947 回答
12

在 SQL Server 中,我会使用:

WHERE CHARINDEX(CHAR(13), name) <> 0 OR CHARINDEX(CHAR(10), name) <> 0

这将搜索回车换行

如果您也想搜索标签,只需添加:

OR CHARINDEX(CHAR(9), name) <> 0
于 2009-08-26T20:27:18.380 回答
3

您还可以使用正则表达式:

SELECT * FROM Parameters WHERE Name REGEXP '\n';
于 2009-08-26T20:22:26.470 回答
2

这有效:从表中选择 * 列如 '%(hit enter)%'

忽略括号并按 Enter 以引入新行。

于 2015-08-10T21:37:55.810 回答
1

您可以创建一个函数:

CREATE FUNCTION dbo.[Check_existance_of_carriage_return_line_feed]
(
      @String VARCHAR(MAX)
)
RETURNS VARCHAR(MAX)
BEGIN
DECLARE @RETURN_BOOLEAN INT

;WITH N1 (n) AS (SELECT 1 UNION ALL SELECT 1),
N2 (n) AS (SELECT 1 FROM N1 AS X, N1 AS Y),
N3 (n) AS (SELECT 1 FROM N2 AS X, N2 AS Y),
N4 (n) AS (SELECT ROW_NUMBER() OVER(ORDER BY X.n)
FROM N3 AS X, N3 AS Y)

SELECT @RETURN_BOOLEAN =COUNT(*)
FROM N4 Nums
WHERE Nums.n<=LEN(@String) AND ASCII(SUBSTRING(@String,Nums.n,1)) 
IN (13,10)    

RETURN (CASE WHEN @RETURN_BOOLEAN >0 THEN 'TRUE' ELSE 'FALSE' END)
END
GO

然后你可以简单地运行这样的查询:

SELECT column_name, dbo.[Check_existance_of_carriage_return_line_feed] (column_name)
AS [Boolean]
FROM [table_name]
于 2018-05-16T14:59:13.450 回答
0

省略第一个查询中的双引号。

... LIKE '%\n%' 
于 2009-08-26T20:17:23.157 回答
0

这样的事情似乎对我有用:

SELECT * FROM Parameters WHERE Name LIKE '%\n%'
于 2009-08-26T20:18:06.043 回答
0

这也有效

SELECT TRANSLATE(STRING_WITH_NL_CR, CHAR(10) || CHAR(13), '  ') FROM DUAL;
于 2013-05-17T13:58:44.303 回答
0

如果你正在考虑创建一个函数,试试这个:DECLARE @schema sysname = 'dbo' , @tablename sysname = 'mvtEST' , @cmd NVarchar(2000) , @ColName sysname

    DECLARE @NewLine Table
    (ColumnName Varchar(100)
    ,Location Int
    ,ColumnValue Varchar(8000)
    )

    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE  TABLE_SCHEMA = @schema AND TABLE_NAME =  @tablename AND DATA_TYPE LIKE '%CHAR%'

    DECLARE looper CURSOR FAST_FORWARD for
    SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME =  @tablename AND DATA_TYPE LIKE '%CHAR%'
    OPEN looper
    FETCH NEXT FROM looper INTO @ColName

    WHILE @@fetch_status = 0
    BEGIN
    SELECT @cmd = 'select ''' +@ColName+    ''',  CHARINDEX(Char(10),  '+  @ColName +') , '+ @ColName + ' from '+@schema + '.'+@tablename +' where CHARINDEX(Char(10),  '+  @ColName +' ) > 0 or CHARINDEX(CHAR(13), '+@ColName +') > 0'
    PRINT @cmd
    INSERT @NewLine ( ColumnName, Location, ColumnValue )
    EXEC sp_executesql @cmd
    FETCH NEXT FROM looper INTO @ColName
    end
    CLOSE looper
    DEALLOCATE looper


    SELECT * FROM  @NewLine
于 2020-02-12T14:56:05.093 回答