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) = ' ';
Vous pouvez trouver des espaces de fin avec LIKE
:
SELECT col FROM tbl WHERE col LIKE '% '
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
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))
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.
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)
Devrait travailler aussi.
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'
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
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
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) = '#'