SQLの文字列から空白を削除しようとしていますが、LTRIM
およびRTRIM
関数が機能しないようです。
行:
[ProductAlternateKey] [nvarchar](25) COLLATE Latin1_General_CS_AS NULL
クエリ:
select REPLACE(ProductAlternateKey, ' ', '@'),
LEN(ProductAlternateKey),
LTRIM(RTRIM(ProductAlternateKey)) AS LRTrim,
LEN(LTRIM(RTRIM(ProductAlternateKey))) AS LRLen,
ASCII(RIGHT(ProductAlternateKey, 1)) AS ASCIIR,
ASCII(LEFT(ProductAlternateKey, 1)) AS ASCIIL,
ProductAlternateKey
from DimProducts
where ProductAlternateKey like '46783815%'
結果:
| COLUMN_0 | COLUMN_1 | LRTrim | LRLen | ASCIIR | ASCIIL | PRODUCTALTERNATEKEY |
---------------------------------------------------------------------------------
| 46783815 | 8 | 46783815| 8| 53 | 52 | 46783815 |
| 46783815 | 10|46783815 | 10| 10 | 52 | 46783815 |
「Enter」など、LTRIM
とRTRIM
が機能しない場合は、他の記号にできますか?
ASCII(RIGHT(ProductAlternateKey, 1))
を使用すると、行2の右端の文字が改行またはASCII文字10であることがわかります。
このできませんは、標準のLTrim
RTrim
関数を使用して削除できます。
ただし、(REPLACE(ProductAlternateKey, CHAR(10), '')
キャリッジリターンとタブを考慮することもできます。これら3つ(ラインフィード、キャリッジリターン、タブ)は通常の原因であり、次の方法で削除できます。
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(ProductAlternateKey, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))
上記で削除できない「空白」文字が見つかった場合は、以下のいずれかまたはすべてを試してください。
--NULL
Replace([YourString],CHAR(0),'');
--Horizontal Tab
Replace([YourString],CHAR(9),'');
--Line Feed
Replace([YourString],CHAR(10),'');
--Vertical Tab
Replace([YourString],CHAR(11),'');
--Form Feed
Replace([YourString],CHAR(12),'');
--Carriage Return
Replace([YourString],CHAR(13),'');
--Column Break
Replace([YourString],CHAR(14),'');
--Non-breaking space
Replace([YourString],CHAR(160),'');
潜在的な空白文字のこのリストを使用して、次のような関数を作成できます。
Create Function [dbo].[CleanAndTrimString]
(@MyString as varchar(Max))
Returns varchar(Max)
As
Begin
--NULL
Set @MyString = Replace(@MyString,CHAR(0),'');
--Horizontal Tab
Set @MyString = Replace(@MyString,CHAR(9),'');
--Line Feed
Set @MyString = Replace(@MyString,CHAR(10),'');
--Vertical Tab
Set @MyString = Replace(@MyString,CHAR(11),'');
--Form Feed
Set @MyString = Replace(@MyString,CHAR(12),'');
--Carriage Return
Set @MyString = Replace(@MyString,CHAR(13),'');
--Column Break
Set @MyString = Replace(@MyString,CHAR(14),'');
--Non-breaking space
Set @MyString = Replace(@MyString,CHAR(160),'');
Set @MyString = LTRIM(RTRIM(@MyString));
Return @MyString
End
Go
次のように使用できます:
Select
dbo.CleanAndTrimString(ProductAlternateKey) As ProductAlternateKey
from DimProducts
その場合、プレフィックス/サフィックスにあるのはスペースではありません。
1行目はOKです。 2番目の行の内容に対して以下を実行します。
ASCII(RIGHT(ProductAlternateKey, 1))
そして
ASCII(LEFT(ProductAlternateKey, 1))
テキストの後に2つのスペースがある場合があります。確認してください。 LTRIM
およびRTRIM
関数も使用できますか?
LTRIM(RTRIM(ProductAlternateKey))
余分なスペースは通常のスペース(ASCII 32、ソフトスペース)ではないのでしょうか?たぶん「ハードスペース」、ASCII 160?
ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))
見えないキャラクターのように見える-
ALT+255
これを試して
select REPLACE(ProductAlternateKey, ' ', '@')
--type ALT+255 instead of space for the second expression in REPLACE
from DimProducts
where ProductAlternateKey like '46783815%'
ラージ
編集:ASCII()の結果に基づいて、ALT+10
-テンキーを使用
これはどう?
CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey)))
FROM DimProducts
where ProductAlternateKey like '46783815%'