SQL Serverのテキスト列が空かどうかを確認するにはどうすればよいですか?


183

SQL Server 2005を使用しています。テキスト列を含むテーブルがあり、テーブルにこの列の値がnullではないが空である多くの行があります。''と比較しようとすると、次の応答が得られます。

データ型textとvarcharは、等しくない演算子では互換性がありません。

テキスト列の値がnullではなく空かどうかを判別する特別な関数はありますか?


1
可能であればデータ型をvarchar(max)に変換します。テキストは非推奨になりました。テーブルに触れている場合は、今すぐ変更を開始することをお勧めします。もちろんあなたのdbaで確認してください。しかし、彼らが変換されなければならない前に、より多くのものが変換されることができるほど、私の考えです。それはあなたが使っているコードの量に依存しますが、今これを行うかどうかに関して壊れるテキストを含みますが、私はそれを持ち出しますので、これは最終的に変更する必要があることを知っています。
HLGEM 2010年

回答:


304
where datalength(mytextfield)=0

2
これは実際の質問ではありませんが、タイトルを読むだけの人に対する発言ですOR mytextfield IS NULL。列が可能なときに追加することを忘れないでくださいNULL
Daan

2
mytextfield IS NULL *OR*:-)
ban-geoengineering 2016年

3
@ ban-geoengineering SQL Server T-SQLは短絡評価手法を尊重しないため、ここでの順序は結果に影響しません。
コンラッド

47
ISNULL(
case textcolum1
    WHEN '' THEN NULL
    ELSE textcolum1
END 
,textcolum2) textcolum1

上記のクエリは実際にはテキスト列のnullと空の性質を処理し、それに応じて条件に基づいて値を割り当てます。これが私が探していたものなので、答えに賛成投票してください。ありがとう
user_v

28

実際には、LIKE演算子を使用する必要があります。

SELECT * FROM mytable WHERE mytextfield LIKE ''

+1 DataLength()、IsNull()、Cast()などのSQL関数を呼び出すことによる追加のオーバーヘッドに依存しないため、ここでは他の答えよりもこの答えを好みます。おそらく、生成されたクエリプランは同じです(チェックしませんでした)。それでも、これはるかにクリーンなアプローチであると思います。
MikeTeeVee

5

空の値のみを取得するには(null値は取得しない):

SELECT * FROM myTable WHERE myColumn = ''

null値と空の値の両方を取得するには:

SELECT * FROM myTable WHERE myColumn IS NULL OR myColumn = ''

null値のみを取得するには:

SELECT * FROM myTable WHERE myColumn IS NULL

nullおよび空以外の値を取得するには:

SELECT * FROM myTable WHERE myColumn <> ''


また、LIKEフレーズは他のタイプの検索と比較してパフォーマンスが低下するため、必要な場合にのみ使用することを忘れないでください。


どういう意味myColumn IS NOT NULL AND my column = '';ですか?
bcsb1001 14

2

IS NULL演算子を使用します。

Select * from tb_Employee where ename is null

1
atoumeyは、「この列の値はnullではないが、空である」と質問で述べているため、ISNULL()は機能しません:)
GazB

2
SELECT * FROM TABLE
WHERE ISNULL(FIELD, '')=''

1
賛成投票されましたが、... where ISNULL(TRIM(Field)、 '')= ''の方が良いです;-)、 ""がスペースを含む空の文字列であると感じた場合
Kirsten

MySQLの正しい構文は次のとおりです。SQL SELECT * FROM TABLE WHERE IFNULL(FIELD, '')=''
CláudioSilva

1

この投稿が古いことは知っていますが、役に立ちました。

空ではないテキストフィールドでレコードを返すという私の問題は解決しなかったので、自分の解決策を追加すると思いました。

これは、私にとって有効なwhere句です。

WHERE xyz LIKE CAST('% %' as text)



0

nullと空の文字列は同等ですか?もしそうなら、私は自分のアプリケーションにロジックを含め(またはアプリが「すぐに使える」ならトリガーかも)、フィールドを強制的にnullまたは ''にしますが、もう一方は強制しません。''を使用した場合、列をNOT NULLに設定することもできます。データをクリーンにするだけです。


0

値がnullまたは空の場合に事前定義されたテキスト(「No Labs Available」)が表示されるようにしたいのですが、私の友人がこれを手伝ってくれました。

StrengthInfo = CASE WHEN ((SELECT COUNT(UnitsOrdered) FROM [Data_Sub_orders].[dbo].[Snappy_Orders_Sub] WHERE IdPatient = @PatientId and IdDrugService = 226)> 0)
                            THEN cast((S.UnitsOrdered) as varchar(50))
                    ELSE 'No Labs Available'
                    END

うわー、サブクエリ。それはまったく高価ではありません。
ジェイクロガン

0

あなたは両方をしなければなりません:

SELECT * FROM Table WHERE Text IS NULL or Text LIKE ''


0

この問題の代替案はたくさんありますが、@ Eric Z Beardと@Tim Cooperが@Enrique Garciaと@UliKöhlerで見つけた最良の解決策をまとめたいと思います。

以下のクエリは0ではなく1を返すため、スペースのみがユースケースシナリオの空と同じになる可能性があるという事実に対処する必要がある場合。

SELECT datalength(' ')

したがって、私は次のようなものに行きます:

SELECT datalength(RTRIM(LTRIM(ISNULL([TextColumn], ''))))


0

を使用isnullする代わりにcase、パフォーマンスのため、より良いケースです。

case when campo is null then '' else campo end

あなたの問題では、これを行う必要があります:

case when campo is null then '' else
  case when len(campo) = 0 then '' else campo en
end

このようなコード:

create table #tabla(
id int,
campo varchar(10)
)

insert into #tabla
values(1,null)

insert into #tabla
values(2,'')

insert into #tabla
values(3,null)

insert into #tabla
values(4,'dato4')

insert into #tabla
values(5,'dato5')

select id, case when campo is null then 'DATA NULL' else
  case when len(campo) = 0 then 'DATA EMPTY' else campo end
end
from #tabla

drop table #tabla

最初にnullかどうかを確認し、次にlen関数を使用します...それが役に立てば幸い
エンリケガルシア

列がNULLでも空でもなく、テキストがない場合はどうなりますか?
Muhammad Idrees

0
DECLARE @temp as nvarchar(20)

SET @temp = NULL
--SET @temp = ''
--SET @temp = 'Test'

SELECT IIF(ISNULL(@temp,'')='','[Empty]',@temp)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.