web-dev-qa-db-ja.com

SQL Server 2008:末尾のスペースを見つける方法

列の末尾にスペースがあるすべての列値を見つけるにはどうすればよいですか?先行スペースについては、単に

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

LIKEで末尾のスペースを見つけることができます:

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

SQL Server 2005:

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

デモとして:

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

戻り値

NoTrail WithTrail
0       1  
7
Neil Moss

これは私のために働いたものです:

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

これにより、末尾にスペースがあるすべてのレコードが得られます。

先頭または末尾のスペースがあるレコードを取得する場合は、これを使用できます。

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

非常に簡単な方法は、LEN関数を使用することです。 LENは後続のスペースをトリムしますが、先行するスペースはトリムしません。したがって、LEN()がLEN(REVERSE())と異なる場合、後続のスペースを含むすべての行が取得されます。

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

また、これを使用して、より高度なロジックに必要なスペースの数を把握することもできます。

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

動作するはずです。

2
Hubbitus

後続スペースの別の代替方法を次に示します。

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

私は受け入れられた答えが少し遅いことがわかりました:

SELECT col FROM tbl WHERE col LIKE '% ';

このテクニックに対して:

SELECT col FROM tbl WHERE ASCII(RIGHT([value], 1)) = 32;

アイデアは最後の文字を取得することですが、そのASCIIコードをスペースのASCIIコードと比較する代わりに' '(スペース)のみを比較します。 ' 'スペースのみを使用する場合、空の文字列はtrueになります。

DECLARE @EmptyString NVARCHAR(12) = '';

SELECT IIF(RIGHT(@EmptyString, 1) = ' ', 1, 0); -- this returns 1

上記は、Microsoftの 文字列比較の実装 によるものです。

それで、正確にどのくらいの速度ですか?

次のコードを試すことができます:

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 '% ';

私のマシンでは、約1秒の違いがあります。

enter image description here

600k行のテーブルでテストしましたが、サイズが大きく、8秒以上の差がありました。そのため、正確な速度は実際のケースデータに依存します。

0
gotqn

これを試して:

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

SQL Serverではスペースが無視されるため、私にとっても先頭のスペースが機能していませんでした。

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

スペース( '')または空白( '')が1つしかない場合は機能しません

だから私は以下を考案しました:

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