web-dev-qa-db-ja.com

SQL Serverを使用して空のスペースをnull値に変換する方法は?

テーブルがあり、このテーブルの列にはいくつかのレコード用の空のスペースが含まれています。次に、データを別のテーブルに移動し、空のスペースをNULL値に置き換える必要があります。

私は使用しようとしました:

REPLACE(ltrim(rtrim(col1)),' ',NULL)

しかし、それは機能しません。 col1のすべての値をNULLに変換します。空のスペースを持つ値のみをNULLに変換したいだけです。

41
niceApp

これを試しましたか?

_UPDATE table 
SET col1 = NULL 
WHERE col1 = ''
_

コメンターが指摘しているように、ltrim()rtrim()を実行する必要はありません。また、NULL列は_''_と一致しません。

40
egrunin

NULLIF関数を使用して同様の問題を解決しました。

UPDATE table 
SET col1 = NULLIF(col1, '')

T-SQLリファレンスから:

2つの式が等しくない場合、NULLIFは最初の式を返します。式が等しい場合、NULLIFは最初の式の型のNULL値を返します。

96
geca

SQL Serverは、文字列を比較するときに末尾の空白を無視するため、 '' = ''です。更新には次のクエリを使用するだけです

UPDATE table
SET col1 = NULL
WHERE col1 = ''

テーブル内のNULL値はNULLのままであり、スペースのみの任意の数のcol1は文字のみがNULLに変更されます。

あるテーブルから別のテーブルへのコピー中にそれを行いたい場合、これを使用します:

INSERT INTO newtable ( col1, othercolumn )
SELECT
   NULLIF(col1, ''),
   othercolumn
FROM table
24
Bennor McCarthy

このコードは、データベース内のすべてのテーブルと列でこれを実現できるSQLを生成します。

SELECT
   'UPDATE ['+T.TABLE_SCHEMA+'].[' + T.TABLE_NAME + '] SET [' + COLUMN_NAME + '] = NULL 
   WHERE [' + COLUMN_NAME + '] = '''''
FROM 
    INFORMATION_SCHEMA.columns C
INNER JOIN
    INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME=T.TABLE_NAME AND C.TABLE_SCHEMA=T.TABLE_SCHEMA
WHERE 
    DATA_TYPE IN ('char','nchar','varchar','nvarchar')
AND C.IS_NULLABLE='YES'
AND T.TABLE_TYPE='BASE TABLE'
12
gls123

ソーステーブルから選択する場合、caseステートメントでトリックを実行する必要があります。

CASE
  WHEN col1 = ' ' THEN NULL
  ELSE col1
END col1

また、注意すべきことの1つは、LTRIMとRTRIMが値をスペース( '')から空白( '')に減らすことです。空白を削除する必要がある場合は、caseステートメントを適切に変更する必要があります。

CASE
  WHEN LTRIM(RTRIM(col1)) = '' THEN NULL
  ELSE LTRIM(RTRIM(col1))
END col1
10
craigh2

たぶんこんな感じ?

UPDATE [MyTable]
SET [SomeField] = NULL
WHERE [SomeField] is not NULL
AND LEN(LTRIM(RTRIM([SomeField]))) = 0
7
user151323

yaの正規表現です。

update table
set col1=null
where col1 not like '%[a-z,0-9]%'

基本的に、文字や数字が含まれていない列を検索し、nullに設定します。特殊文字のみの列がある場合、更新する必要があります。

0
DForck42