web-dev-qa-db-fra.com

SQL Server 2008: comment trouver des espaces de fin

Comment trouver toutes les valeurs de colonne d'une colonne comportant des espaces de fin? Pour les espaces principaux, il serait simplement 

select col from table where substring(col,1,1) = ' ';
31
atricapilla

Vous pouvez trouver des espaces de fin avec LIKE:

SELECT col FROM tbl WHERE col LIKE '% '
55
Jaxidian

SQL Server 2005:

select col from tbl where right(col, 1) = ' '

En démo:

select 
    case when right('said Fred', 1) = ' ' then 1 else 0 end as NoTrail,
    case when right('said Fred ', 1) = ' ' then 1 else 0 end as WithTrail

résultats

NoTrail WithTrail
0       1  
7
Neil Moss

C'est ce qui a fonctionné pour moi: 

select * from table_name where column_name not like RTRIM(column_name)

Cela vous donnera tous les enregistrements qui ont des espaces de fin. 

Si vous souhaitez obtenir les enregistrements comportant des espaces de début ou de fin, vous pouvez utiliser ceci:

select * from table_name where column_name not like LTRIM(RTRIM(column_name))
3

Une méthode très simple consiste à utiliser la fonction LEN . LEN coupe les espaces de fin, mais pas les espaces précédents, donc si votre LEN () est différent de votre LEN (REVERSE ()), vous obtiendrez toutes les lignes contenant des espaces:

select col from table where LEN(col) <> LEN(REVERSE(col));

cela peut également être utilisé pour déterminer combien d'espaces vous avez pour une logique plus avancée.

3
Allan S. Hansen
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)

Devrait travailler aussi.

1
Hubbitus

Il y a plusieurs façons de le faire ....

Mon option préférée, en supposant que votre intention soit de supprimer tous les espaces de début et/ou de fin, consiste à exécuter ce qui suit, ce qui créera dynamiquement le T-SQL en UPDATE toutes les colonnes avec un espace non souhaité à leur valeur ajustée:

SELECT 
'UPDATE [<DatabaseName>].[dbo].['+TABLE_NAME+']
SET ['+COLUMN_NAME+']=LTRIM(RTRIM(['+COLUMN_NAME+']))
WHERE ['+COLUMN_NAME+']=LTRIM(RTRIM(['+COLUMN_NAME+']));'+CHAR(13)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '<TableName>%' 
    AND DATA_TYPE!='date'
ORDER BY TABLE_NAME,COLUMN_NAME

Si vous avez vraiment besoin de les identifier, essayez l'une de ces requêtes:

SELECT *
FROM [database].[schema].[table]
WHERE [col1]!=LTRIM(RTRIM([col1]))

SQL plus dynamique:

SELECT 'SELECT ''['+TABLE_NAME+'].['+COLUMN_NAME+']'',*
FROM [<your database name>].[dbo].['+TABLE_NAME+']
WHERE ['+COLUMN_NAME+'] LIKE ''% ''
    OR ['+COLUMN_NAME+'] LIKE '' %'';
GO
'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME LIKE '<filter table name as desired>%'
    AND DATA_TYPE!='date'
1
SQL_Underworld

Voici une autre alternative pour les espaces de fuite.

DECLARE @VALUE VARCHAR(50) = NULL

DECLARE @VALUE VARCHAR(50) = '  '

IF ((@VALUE IS NOT NULL) AND (LTRIM(RTRIM(@VALUE)) != ''))

BEGIN
   SELECT 'TRUE'
END
ELSE
BEGIN
   SELECT 'FALSE'
END
0
Alfa Thakkar

Essaye ça: 

UPDATE Battles
SET name = CASE WHEN (LEN(name+'a')-1)>LEN(RTRIM(name))
THEN REPLICATE(' ', (LEN(name+'a')-1)- LEN(RTRIM(name)))+RTRIM(name)
ELSE name
END
0
besartm

Les espaces sont ignorés dans SQL Server, de sorte que même l'espace principal ne fonctionnait pas.

select col from table where substring(col,1,1) = ' '

ne fonctionnera pas s'il n'y a qu'un seul espace ('') ou vide ('')

j'ai donc conçu ce qui suit: 

select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'
0
Thunder