SQL Server "Metin" veri türündeki WHERE cümlesi


91

Burada [CastleType], SQL Server'da veri türü "metin" olarak ayarlanır ve sorgu şu şekildedir:

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

Şu hatayı alıyorum:

TEXT ve VARCHAR veri türleri eşittir operatörü ile uyumsuzdur.

Bu veri türünü bir WHERE yan tümcesi ile sorgulayamaz mıyım?


9
Kullanım VARCHAR(MAX)yerine TEXT- veri türü kullanımdan kaldırıldı olduğunu
Marc_s

Yanıtlar:


101

Bunun LIKEyerine kullanabilirsiniz =. Joker karakterler olmadan bu aynı etkiye sahip olacaktır.

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

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

textkullanımdan kaldırıldı. Olarak değiştirmek, varchar(max)çalışmak daha kolay olacaktır.

Ayrıca veriler ne kadar büyük olabilir? Eşitlik karşılaştırmaları yapacaksanız, ideal olarak bu sütunu indekslemek isteyeceksiniz. Sütunu 900 bayttan daha geniş bir şey olarak bildirirseniz, bu tür bir sorguyu hızlandırmak için kullanılabilecek bir hesaplanmış checksumveya hashsütun ekleyebilirsiniz .


22

Lütfen bunu dene

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

Bu ayrıca, ilk çalıştırmada görülebilecek BLOB türü alanlarını koruyan Sql Sunucusu için Toad gibi bazı araçlar kullanıyorsanız, METİN alanındaki verileri doğrudan görebilmek için de yararlıdır. Toad'a alanı göstermesini söylemek için her zaman alana tıklayabilirsiniz, ancak bu iki adımlı bir prosedürdür.
Roger

Bunun muhtemelen sorgunuzu sargılamaz hale getireceğini unutmayın .
Heinzi

13

Sen karşılaştırmak olamaz textile =operatör, ancak bunun yerine listelenen karşılaştırma işlevlerinden biri kullanılan gerekir burada . Ayrıca sayfanın üst kısmındaki büyük uyarı kutusuna dikkat edin, bu önemlidir.


5

Varchar (max) kullanmak için tablonun kendisindeki veri türünü değiştiremezseniz, sorgunuzu şununla değiştirin:

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

2

Hata mesajının söylediği bu değil. =Operatörü kullanamayacağınızı söylüyor . Örneğin deneyin LIKE 'foo'.


Col IN ('foo', 'bar')temelde aynıdır Col = 'foo' or Col = 'bar've aynı soruna sahip olacaktır.
Martin Smith

@Martin: Vurgu için teşekkürler, bunu bilmiyordum. O zaman düzelteceğim.
Will Marcouiller

0

Diğer bir seçenek şudur:

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

Bunun like 'foo'bu yaklaşımdan daha iyi kardinalite tahminleri verebileceğinden şüpheleniyorum, ancak% 100 emin değilim.
Martin Smith

@Martin: Bir TEXT sütununu dizine ekleyemediğiniz için, her iki durumda da tam bir tablo taraması yapacağınızı düşünüyorum.
Joe Stefanelli

Kabul ediyorum, ancak katılma kararlarını vb
Martin Smith

0

Bu MSSQL ve MySQL'de çalışır:

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

1
OP, MySQL değil MSSQL kullanıyor.
Deckard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.