Klausa WHERE pada tipe data "Teks" SQL Server

91

Di mana [CastleType] disetel sebagai tipe data "teks" di SQL Server dan kuerinya adalah:

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

Saya mendapatkan kesalahan:

Jenis data TEXT dan VARCHAR tidak kompatibel di operator yang sama.

Bisakah saya tidak menanyakan tipe data ini dengan klausa WHERE?

mmcglynn.dll
sumber
9
Gunakan VARCHAR(MAX)alih-alih TEXT- tipe data itu tidak digunakan lagi
marc_s

Jawaban:

101

Anda dapat menggunakan LIKEsebagai pengganti =. Tanpa karakter pengganti apa pun, ini akan memiliki efek yang sama.

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

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

textsudah ditinggalkan. Mengubah menjadi varchar(max)akan lebih mudah untuk dikerjakan.

Juga seberapa besar kemungkinan datanya? Jika Anda akan melakukan perbandingan kesetaraan, idealnya Anda ingin mengindeks kolom ini. Ini tidak mungkin jika Anda mendeklarasikan kolom sebagai sesuatu yang lebih lebar dari 900 byte meskipun Anda dapat menambahkan kolom yang dihitung checksumatau hashyang dapat digunakan untuk mempercepat jenis kueri ini.

Martin Smith
sumber
22

Silakan coba ini

SELECT *
FROM   [Village]
WHERE  CONVERT(VARCHAR, CastleType) = 'foo'
Emma Thapa
sumber
Ini juga berguna untuk dapat langsung melihat data di bidang TEXT jika Anda menggunakan beberapa alat seperti Toad untuk Sql Server yang melindungi bidang jenis BLOB untuk dilihat pada eksekusi pertama. Anda selalu dapat mengklik bidang tersebut untuk memberi tahu Toad agar memperlihatkan bidang tersebut, tetapi ini adalah prosedur dua langkah.
Roger
Perhatikan bahwa ini mungkin akan membuat kueri Anda tidak dapat dikenai biaya .
Heinzi
13

Anda tidak dapat membandingkan textdengan =operator, tetapi harus menggunakan salah satu fungsi perbandingan yang tercantum di sini . Perhatikan juga kotak peringatan besar di bagian atas halaman, ini penting.

Donnie
sumber
5

Jika Anda tidak dapat mengubah tipe data pada tabel itu sendiri untuk menggunakan varchar (max), maka ubah kueri Anda menjadi ini:

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

Bukan itu yang dikatakan pesan kesalahan. Dikatakan bahwa Anda tidak dapat menggunakan =operator. Coba misalnya LIKE 'foo'.

Akan Marcouiller
sumber
Col IN ('foo', 'bar')pada dasarnya sama Col = 'foo' or Col = 'bar'dan akan memiliki masalah yang sama.
Martin Smith
@ Martin: Terima kasih atas sorotannya, saya tidak mengetahuinya. Kalau begitu saya akan memperbaikinya.
Akankah Marcouiller
0

Pilihan lainnya adalah:

SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
Joe Stefanelli
sumber
Saya menduga itu like 'foo'mungkin memberikan perkiraan kardinalitas yang lebih baik daripada pendekatan ini tetapi saya tidak yakin 100%.
Martin Smith
@ Martin: Karena Anda tidak dapat mengindeks kolom TEXT, saya pikir Anda akan berakhir dengan pemindaian tabel lengkap dalam kedua kasus.
Joe Stefanelli
Saya setuju tetapi masih akan menggunakan statistik pada kolom untuk mendapatkan perkiraan baris yang akan dikembalikan yang mungkin mempengaruhi keputusan bergabung, dll.
Martin Smith
0

Ini berfungsi di MSSQL dan MySQL:

SELECT *
FROM   Village
WHERE  CastleType LIKE '%foo%'; 
himan
sumber
1
OP menggunakan MSSQL bukan MySQL.
Deckard