Gdzie [CastleType] jest ustawiony jako typ danych „tekst” w SQL Server, a zapytanie to:
SELECT *
FROM [Village]
WHERE [CastleType] = 'foo'
Wyskakuje mi błąd:
Typy danych TEXT i VARCHAR są niezgodne w przypadku operatora równości.
Czy nie mogę zapytać o ten typ danych za pomocą klauzuli WHERE?
sql-server
sql-server-2005
tsql
mmcglynn
źródło
źródło
VARCHAR(MAX)
zamiastTEXT
- ten typ danych jest przestarzałyOdpowiedzi:
Możesz użyć
LIKE
zamiast=
. Bez żadnych symboli wieloznacznych będzie to miało ten sam efekt.DECLARE @Village TABLE (CastleType TEXT) INSERT INTO @Village VALUES ( 'foo' ) SELECT * FROM @Village WHERE [CastleType] LIKE 'foo'
text
jest przestarzałe. Zmiana navarchar(max)
będzie łatwiejsza w obsłudze.Jak duże będą prawdopodobnie dane? Jeśli zamierzasz przeprowadzać porównania równości, najlepiej zindeksować tę kolumnę. Nie jest to możliwe, jeśli zadeklarujesz kolumnę jako inną niż 900 bajtów, chociaż możesz dodać kolumnę obliczoną
checksum
lubhash
kolumnę, której można użyć do przyspieszenia tego typu zapytania.źródło
Spróbuj tego
SELECT * FROM [Village] WHERE CONVERT(VARCHAR, CastleType) = 'foo'
źródło
Nie można porównywać
text
z=
operatorem, ale zamiast tego należy użyć jednej z wymienionych tutaj funkcji porównania . Zwróć także uwagę na duże pole ostrzegawcze u góry strony, jest to ważne.źródło
Jeśli nie możesz zmienić typu danych w samej tabeli, aby używać varchar (max), zmień zapytanie na to:
SELECT * FROM [Village] WHERE CONVERT(VARCHAR(MAX), [CastleType]) = 'foo'
źródło
Nie o tym mówi komunikat o błędzie. Mówi, że nie możesz użyć
=
operatora. Spróbuj na przykładLIKE 'foo'
.źródło
Col IN ('foo', 'bar')
jest w zasadzie taki sam jakCol = 'foo' or Col = 'bar'
i będzie miał ten sam problem.Inną opcją byłoby:
SELECT * FROM [Village] WHERE PATINDEX('foo', [CastleType]) <> 0
źródło
like 'foo'
może to dać lepsze szacunki kardynalności niż to podejście, ale nie jestem w 100% pewien.Działa to w MSSQL i MySQL:
SELECT * FROM Village WHERE CastleType LIKE '%foo%';
źródło