SQL Serverの「テキスト」データ型のWHERE句


89

[CastleType]はSQL Serverでデータ型「テキスト」として設定されており、クエリは次のとおりです。

SELECT *
FROM   [Village]
WHERE  [CastleType] = 'foo' 

エラーが発生します:

データ型TEXTVARCHARは、等号演算子では互換性がありません。

このデータ型をWHERE句でクエリできませんか?


9
VARCHAR(MAX)代わりに使用TEXT-そのデータ型は非推奨
marc_s

回答:


99

LIKE代わりに使用できます=。ワイルドカードがなければ、これは同じ効果があります。

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

SELECT *
FROM   @Village
WHERE  [CastleType] LIKE 'foo' 

text廃止予定です。に変更するvarchar(max)と、作業がしやすくなります。

また、データはどのくらいの大きさになる可能性がありますか?等価比較を行う場合は、この列にインデックスを付けるのが理想的です。このタイプのクエリを高速化するために使用できる計算された列checksumまたはhash列を追加できますが、列を900バイトより広いものとして宣言する場合、これは不可能です。


19

これをお試しください

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR, CastleType) = 'foo'

これは、Toad for Sql Serverなど、BLOBタイプのフィールドが最初の実行時に表示されるのを保護するツールを使用している場合に、TEXTフィールドのデータを直接表示できる場合にも役立ちます。いつでもフィールドをクリックしてToadにフィールドを表示するように指示できますが、これは2ステップの手順です。
ロジャー

これにより、クエリが検索不能になる可能性があります。
ハインツィ

13

演算子textと比較することはできません=が、代わりにここにリストされている比較関数の1つを使用する必要があります。また、ページの上部にある大きな警告ボックスにも注意してください。これは重要です。


5

テーブル自体のデータ型を変更してvarchar(max)を使用できない場合は、クエリを次のように変更します。

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'

2

それはエラーメッセージが言うことではありません。=演算子は使用できないと書いてあります。たとえば試してみてくださいLIKE 'foo'


Col IN ('foo', 'bar')基本的に同じでCol = 'foo' or Col = 'bar'あり、同じ問題が発生します。
マーティン・スミス

@マーティン:ハイライトをありがとう、私はそれについて知りませんでした。それを修正します。
Marcouillerが

0

別のオプションは次のとおりです。

SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0

私はそれが疑われるlike 'foo'このアプローチよりも良いカーディナリティの推定値を与えるかもしれないが、100%を確認していません。
Martin Smith、

@Martin:TEXT列にインデックスを付けることはできないので、どちらの場合もテーブル全体をスキャンすることになると思います。
ジョーステファネッリ

私は同意するが、それはまだ決定などに参加影響を及ぼす可能性があります返される行の推定値を取得するには、列の統計を使用します
マーティン・スミス

0

これはMSSQLとMySQLで機能します。

SELECT *
FROM   Village
WHERE  CastleType LIKE '%foo%'; 

1
OPはMySQLではなくMSSQLを使用しています。
Deckard
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.