有馬総一郎のブログ

(彼氏の事情)

SQL Severのntext型の項目の比較はLIKEを使っちゃえ

SQL Severにおいて、ntext型の比較はメンド臭い。

select
  *
from
  SAMPLE_TABLE
where
  NTEXT_COLUMN = 'condition_value'

とやるとデータ型 ntext と varchar は not equal to 演算子では互換性がありません。となる…イケてない

正攻法として

select
  *
from
  SAMPLE_TABLE
where
  cast(NTEXT_COLUMN as nvarchar(max)) = 'condition_value'

してもいいのだけど…何か面倒じゃない。そう諦めていたけど、一応ググってみると

sql - What’s the right way to compare an NTEXT column with a constant value? - Stack Overflow

LIKEっという手段を発見

select
  *
from
  SAMPLE_TABLE
where
  NTEXT_COLUMN like 'condition_value'

実行計画見ると、一応違いがある。当たり前にcastしたやつはconvertの処理が入ってる。

cast

SHOWPLAN_ALL  (0.415)
 +-Filter(WHERE:([Expr1003]=CONVERT_IMPLICIT(nvarchar(max),'condition_value',0)))  (0.415)
    +-Compute Scalar(DEFINE:([Expr1003]=CONVERT(nvarchar(max),[DB].[SCHEMA].[SAMPLE_TABLE].[NTEXT_COLUMN],0)))  (0.414)
       +-Clustered Index Scan(OBJECT:([DB].[SCHEMA].[SAMPLE_TABLE].[PK_SAMPLE_TABLE]))  (0.414)

like

SHOWPLAN_ALL  (0.415)
 +-Filter(WHERE:([DB].[SCHEMA].[SAMPLE_TABLE].[NTEXT_COLUMN] like N'condition_value'))  (0.415)
    +-Clustered Index Scan(OBJECT:([DB].[SCHEMA].[SAMPLE_TABLE].[PK_SAMPLE_TABLE]))  (0.414)

パフォーマンスとかどうなんだろうな。LIKEが気持ち悪いというのも分かる。でも、動的なSQLを作り上げなきゃいれない場合だと、ntextの処理入れるの面倒で、LIKEでやってしまいそうだ。

Comments