【问题标题】:SQL query for a carriage return in a string and ultimately removing carriage returnSQL查询字符串中的回车并最终删除回车
【发布时间】:2010-11-23 03:48:27
【问题描述】:

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

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

我试过了

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

还有

select * from Parameters
where Name LIKE '\r'

'

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

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

【问题讨论】:

  • 这是用于 sql server 的吗?

标签: sql char carriage-return sql-like


【解决方案1】:

如果您正在考虑创建函数,请尝试以下操作: 宣布 @schema 系统名称 = 'dbo' , @tablename 系统名 = 'mvtEST' , @cmd NVarchar(2000) , @ColName 系统名

    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

【讨论】:

    【解决方案2】:

    你可以创建一个函数:

    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]
    

    【讨论】:

      【解决方案3】:

      在 SQL Server 中我会使用:

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

      这将同时搜索回车换行符

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

      OR CHARINDEX(CHAR(9), name) <> 0
      

      【讨论】:

        【解决方案4】:

        这有效: select * from table where column like '%(hit enter)%'

        忽略括号并按回车键引入新行。

        【讨论】:

          【解决方案5】:

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

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

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

                 replace(replace(Name,CHR(10),''),CHR(13),'')
          

          【讨论】:

          • 这个选择只会显示没有回车和换行的表格,但是如何将它从源表格中永久删除?
          【解决方案6】:

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

          SELECT * FROM Parameters WHERE Name LIKE '%\n%'
          

          【讨论】:

            【解决方案7】:

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

            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) || '%'
            

            【讨论】:

            • Postgresql 使用函数名chr 而不是char
            • 我从未见过在 SQL 字符串中使用 || 而不是 OR。什么时候担心?
            • @mmcrae 如果您查看编辑历史记录,您会看到“ANSI SQL”部分已添加到我的答案中。我从未在我所做的任何 SQL 中使用过||。我从来没有真正关心过 ANSI SQL 等价物。我只是为当前数据库编写代码并完成它。根据我的经验,您永远不会从一个数据库供应商转换为另一个数据库供应商。每个供应商都在 ANSI 标准之外和/或代替 ANSI 标准添加了许多额外的 SQL 命令或变体,这使得几乎不可能编写任何复杂的代码并 100% 兼容 ANSI。
            • ||不是 OR 。在 postgresql 中是连接。
            • @jipipayo,我不喜欢人们这样编辑我的答案。
            【解决方案8】:

            这也有效

            SELECT TRANSLATE(STRING_WITH_NL_CR, CHAR(10) || CHAR(13), '  ') FROM DUAL;
            

            【讨论】:

            • 这是Oracle语法吗?
            【解决方案9】:

            你也可以使用正则表达式:

            SELECT * FROM Parameters WHERE Name REGEXP '\n';
            

            【讨论】:

              【解决方案10】:

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

              ... LIKE '%\n%' 
              

              【讨论】:

                猜你喜欢
                • 2011-06-21
                • 1970-01-01
                • 2017-12-11
                • 1970-01-01
                • 2014-05-20
                • 1970-01-01
                • 2011-03-04
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多