web-dev-qa-db-ja.com

SQL Serverの文字列から空白文字を削除する方法

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」など、LTRIMRTRIMが機能しない場合は、他の記号にできますか?

30
Justin

ASCII(RIGHT(ProductAlternateKey, 1))を使用すると、行2の右端の文字が改行またはASCII文字10であることがわかります。

このできませんは、標準のLTrimRTrim関数を使用して削除できます。

ただし、(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
69
DMK

その場合、プレフィックス/サフィックスにあるのはスペースではありません。
1行目はOKです。 2番目の行の内容に対して以下を実行します。

ASCII(RIGHT(ProductAlternateKey, 1))

そして

ASCII(LEFT(ProductAlternateKey, 1))
4
shahkalpesh

テキストの後に2つのスペースがある場合があります。確認してください。 LTRIMおよびRTRIM関数も使用できますか?

LTRIM(RTRIM(ProductAlternateKey))

余分なスペースは通常のスペース(ASCII 32、ソフトスペース)ではないのでしょうか?たぶん「ハードスペース」、ASCII 160?

ltrim(rtrim(replace(ProductAlternateKey, char(160), char(32))))
3
TechDo

見えないキャラクターのように見える-

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-テンキーを使用

0
Raj

これはどう?

CASE WHEN ProductAlternateKey is NOT NULL THEN
CONVERT(NVARCHAR(25), LTRIM(RTRIM(ProductAlternateKey))) 
FROM DimProducts
where ProductAlternateKey  like '46783815%'
0
mr_eclair