Wie kann ich in einer Spalte alle Spaltenwerte finden, die Leerzeichen enthalten? Für führende Räume wäre es einfach so
select col from table where substring(col,1,1) = ' ';
Sie können nachgestellte Leerzeichen mit LIKE
finden:
SELECT col FROM tbl WHERE col LIKE '% '
SQL Server 2005:
select col from tbl where right(col, 1) = ' '
Als Demo:
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
kehrt zurück
NoTrail WithTrail
0 1
Das hat bei mir funktioniert:
select * from table_name where column_name not like RTRIM(column_name)
Dadurch erhalten Sie alle Datensätze, die Leerzeichen enthalten.
Wenn Sie Datensätze mit führenden oder nachgestellten Leerzeichen abrufen möchten, können Sie Folgendes verwenden:
select * from table_name where column_name not like LTRIM(RTRIM(column_name))
Eine sehr einfache Methode ist die Verwendung der LEN-Funktion. LEN schneidet nachfolgende Leerzeichen ab, jedoch keine vorangestellten Leerzeichen. Wenn sich also Ihr LEN () von Ihrem LEN (REVERSE ()) unterscheidet, erhalten Sie alle Zeilen mit nachfolgenden Leerzeichen:
select col from table where LEN(col) <> LEN(REVERSE(col));
dies kann auch verwendet werden, um herauszufinden, wie viele Leerzeichen Sie für eine erweiterte Logik haben.
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)
Sollte auch funktionieren.
Dafür gibt es verschiedene Möglichkeiten ...
Meine bevorzugte Option, vorausgesetzt, Sie beabsichtigen, führende Leerzeichen und/oder nachfolgende Leerzeichen zu entfernen, besteht darin, Folgendes auszuführen, wodurch T-SQL dynamisch erstellt wird, um UPDATE
alle Spalten mit einem unerwünschten Leerzeichen auf ihren angepassten Wert zu setzen:
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
Wenn Sie sie wirklich identifizieren müssen, versuchen Sie eine der folgenden Abfragen:
SELECT *
FROM [database].[schema].[table]
WHERE [col1]!=LTRIM(RTRIM([col1]))
Dynamischeres SQL:
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'
Hier ist eine weitere Alternative für nachfolgende Leerzeichen.
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
Ich habe die akzeptierte Antwort etwas langsamer gefunden:
SELECT col FROM tbl WHERE col LIKE '% ';
gegen diese Technik:
SELECT col FROM tbl WHERE ASCII(RIGHT([value], 1)) = 32;
Die Idee ist, das letzte Zeichen abzurufen, aber den ASCII
-Code mit dem ASCII
-Code des Leerzeichens zu vergleichen, stattdessen nur mit ' '
(Platz). Wenn wir nur ' '
Leerzeichen, ein leerer String ergibt true:
DECLARE @EmptyString NVARCHAR(12) = '';
SELECT IIF(RIGHT(@EmptyString, 1) = ' ', 1, 0); -- this returns 1
Das obige ist wegen des Microsoft Implementierung von Zeichenkettenvergleichen .
Also, wie schnell genau?
Sie können den folgenden Code versuchen:
CREATE TABLE #DataSource
(
[RowID] INT PRIMARY KEY IDENTITY(1,1)
,[value] NVARCHAR(1024)
);
INSERT INTO #DataSource ([value])
SELECT TOP (1000000) 'text ' + CAST(ROW_NUMBER() OVER(ORDER BY t1.number) AS VARCHAR(12))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
UPDATE #DataSource
SET [value] = [value] + ' '
WHERE [RowID] = 100000;
SELECT *
FROM #DataSource
WHERE ASCII(RIGHT([value], 1)) = 32;
SELECT *
FROM #DataSource
WHERE [value] LIKE '% ';
Auf meinem Computer gibt es etwa 1 Sekunde Unterschied:
Ich habe es auf einem Tisch mit 600k Zeilen getestet, aber größer, und der Unterschied lag über 8 Sekunden. Wie schnell das genau ist, hängt also von Ihren tatsächlichen Falldaten ab.
Versuche dies:
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
Leerzeichen werden in SQL Server ignoriert, sodass der führende Speicherplatz für mich nicht funktioniert hat.
select col from table where substring(col,1,1) = ' '
funktioniert nicht, wenn nur ein Leerzeichen ('') oder Leerzeichen ('') vorhanden ist
also habe ich mir folgendes ausgedacht:
select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'