it-swarm.com.de

SQL Server 2008: So finden Sie nachstehende Leerzeichen

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) = ' ';
31
atricapilla

Sie können nachgestellte Leerzeichen mit LIKE finden:

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

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  
7
Neil Moss

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.

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

Sollte auch funktionieren.

1
Hubbitus

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'
1
SQL_Underworld

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
0
Alfa Thakkar

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:

enter image description here

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.

0
gotqn

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
0
besartm

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) = '#'
0
Thunder