SQL-запрос на возврат каретки в строке и, в конечном итоге, удаление возврата каретки
-
20-09-2019 - |
Вопрос
SQL-запрос на возврат каретки в строке и, в конечном итоге, удаление возврата каретки
У меня есть некоторые данные в таблице, и есть возвраты каретки в тех местах, где они мне не нужны.Я пытаюсь написать запрос, чтобы получить все строки, содержащие возвраты каретки.
Я попробовал это
select * from Parameters
where Name LIKE '%"\n" %'
Также
select * from Parameters
where Name LIKE '\r'
'
Оба являются действительными SQL, но не возвращают то, что я ищу.Нужно ли мне использовать Нравиться команда или другая команда?Как мне получить возврат каретки в запросе?
Возврат каретки также не обязательно находится в конце строки (может быть и в середине).
Решение
это будет медленно, но если это единоразово, попробуйте...
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) || '%'
Другие советы
Главным вопросом было убрать CR/LF.Использование функций replace и char работает для меня:
Select replace(replace(Name,char(10),''),char(13),'')
Для Postgres или Oracle SQL вместо этого используйте функцию CHR:
replace(replace(Name,CHR(10),''),CHR(13),'')
В SQL Server я бы использовал:
WHERE CHARINDEX(CHAR(13), name) <> 0 OR CHARINDEX(CHAR(10), name) <> 0
Это будет искать оба возврат каретки и переводы строк.
Если вы хотите найти вкладки тоже просто добавь:
OR CHARINDEX(CHAR(9), name) <> 0
Вы также можете использовать регулярные выражения:
SELECT * FROM Parameters WHERE Name REGEXP '\n';
это работает:выберите * из таблицы, где столбец типа «% (нажмите Enter)%»
Не обращайте внимания на скобки и нажмите Enter, чтобы ввести новую строку.
Вы можете создать функцию:
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]
Опустите двойные кавычки из вашего первого запроса.
... LIKE '%\n%'
Это также работает
SELECT TRANSLATE(STRING_WITH_NL_CR, CHAR(10) || CHAR(13), ' ') FROM DUAL;
Кажется, что-то вроде этого работает для меня:
SELECT * FROM Parameters WHERE Name LIKE '%\n%'