SQL-запрос для возврата каретки в строке и, в конечном итоге, удаления возврата каретки - PullRequest
48 голосов
/ 27 августа 2009

SQL-запрос для возврата каретки в строке и, в конечном итоге, удаления возврата каретки

У меня есть некоторые данные в таблице, и в тех местах, где я не хочу их, есть возврат каретки. Я пытаюсь написать запрос, чтобы получить все строки, содержащие возврат каретки.

Я пробовал это

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

Также

select * from Parameters
where Name LIKE '\r'

Оба являются допустимыми SQL, но не возвращают то, что я ищу. Нужно ли использовать команду Like или другую команду? Как получить возврат каретки в запрос?

Возврат каретки также не обязательно находится в конце строки (может быть в середине).

Ответы [ 9 ]

65 голосов
/ 27 августа 2009

это будет медленно, но если это разовая вещь, попробуйте ...

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) || '%'
58 голосов
/ 21 сентября 2012

Главным вопросом было удаление CR / LF. Использование функций replace и char работает для меня:

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

Для Postgres или Oracle SQL используйте вместо этого функцию CHR:

       replace(replace(Name,CHR(10),''),CHR(13),'')
9 голосов
/ 27 августа 2009

В SQL Server я бы использовал:

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

При этом будет выполнен поиск возврата каретки и перевода строки .

Если вы хотите найти вкладки тоже просто добавьте:

OR CHARINDEX(CHAR(9), name) <> 0
3 голосов
/ 27 августа 2009

Вы также можете использовать регулярные выражения:

SELECT * FROM Parameters WHERE Name REGEXP '\n';
2 голосов
/ 11 августа 2015

это работает: выберите * из таблицы, где столбец, как '% (нажмите ввод)%'

Игнорируйте скобки и нажмите ввод, чтобы ввести новую строку.

1 голос
/ 16 мая 2018

Вы можете создать функцию:

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]
0 голосов
/ 17 мая 2013

Это также работает

SELECT TRANSLATE(STRING_WITH_NL_CR, CHAR(10) || CHAR(13), '  ') FROM DUAL;
0 голосов
/ 27 августа 2009

Мне кажется, что-то вроде этого работает:

SELECT * FROM Parameters WHERE Name LIKE '%\n%'
0 голосов
/ 27 августа 2009

Опустите двойные кавычки из вашего первого запроса.

... LIKE '%\n%' 
...