列の末尾にスペースがあるすべての列値を見つけるにはどうすればよいですか?先行スペースについては、単に
select col from table where substring(col,1,1) = ' ';
LIKE
で末尾のスペースを見つけることができます:
SELECT col FROM tbl WHERE col LIKE '% '
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
これは私のために働いたものです:
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));
また、これを使用して、より高度なロジックに必要なスペースの数を把握することもできます。
SELECT * FROM tbl WHERE LEN(col) != DATALENGTH(col)
動作するはずです。
後続スペースの別の代替方法を次に示します。
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
私は受け入れられた答えが少し遅いことがわかりました:
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秒の違いがあります。
600k行のテーブルでテストしましたが、サイズが大きく、8秒以上の差がありました。そのため、正確な速度は実際のケースデータに依存します。
これを試して:
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
SQL Serverではスペースが無視されるため、私にとっても先頭のスペースが機能していませんでした。
select col from table where substring(col,1,1) = ' '
スペース( '')または空白( '')が1つしかない場合は機能しません
だから私は以下を考案しました:
select * from [table] where substring(REPLACE(col, ' ', '#'),1,1) = '#'