web-dev-qa-db-fra.com

Requête SQL pour un retour chariot dans une chaîne et finalement suppression du retour chariot

Requête SQL pour un retour chariot dans une chaîne et finalement suppression du retour chariot

J'ai des données dans un tableau et il y a des retours à la voiture dans des endroits où je ne les veux pas. J'essaie d'écrire une requête pour obtenir toutes les chaînes qui contiennent des retours chariots.

J'ai essayé ça

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

Également

select * from Parameters
where Name LIKE '\r'

'

Les deux sont valides SQL mais ne retournent pas ce que je cherche. Dois-je utiliser la commande Like ou une commande différente? Comment puis-je obtenir le retour chariot dans la requête?

Le retour chariot n'est pas nécessairement au bout de la ligne (peut être au milieu).

47
Maestro1024

ce sera lent, mais s'il s'agit d'une chose unique, essayez ...

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

Notez que l'opérateur de concaténation de chaîne SQL ANSI est "||". Il peut donc être nécessaire qu'il soit:

select * from parameters where name like '%' || char(13) || '%' or name like '%' || char(10) || '%'
64
KM.

La principale question était de supprimer le CR/LF. Utiliser les fonctions replace et char fonctionne pour moi:

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

Pour Postgres ou Oracle SQL, utilisez plutôt la fonction CHR:

       replace(replace(Name,CHR(10),''),CHR(13),'')
57
Grant Dever

Dans SQL Server, j'utiliserais: 

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

Ceci recherchera à la fois les retours chariot et les sauts de ligne.

Si vous voulez rechercher tabs, ajoutez simplement:

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

Vous pouvez également utiliser des expressions régulières:

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

cela fonctionne:

Ignorez les crochets et appuyez sur Entrée pour introduire une nouvelle ligne.

2
Logan

Vous pouvez créer une fonction:

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

Ensuite, vous pouvez simplement exécuter une requête comme ceci:

SELECT column_name, dbo.[Check_existance_of_carriage_return_line_feed] (column_name)
AS [Boolean]
FROM [table_name]
1
Amit Tikoo

Cela fonctionne aussi

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

Omettez les guillemets de votre première requête.

... LIKE '%\n%' 
0
Byron Whitlock

Quelque chose comme cela semble fonctionner pour moi:

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