Clausola WHERE sul tipo di dati "Testo" di SQL Server


91

Dove [CastleType] è impostato come tipo di dati "testo" in SQL Server e la query è:

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

Ottengo l'errore:

I tipi di dati TEXT e VARCHAR sono incompatibili nell'operatore uguale a.

Non posso interrogare questo tipo di dati con una clausola WHERE?


9
Usa VARCHAR(MAX)invece di TEXT- quel tipo di dati è deprecato
marc_s

Risposte:


101

Puoi usare LIKEinvece di =. Senza caratteri jolly questo avrà lo stesso effetto.

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

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

textè deprecato. Passare a varchar(max)sarà più facile lavorare con.

Inoltre, quanto è probabile che siano grandi i dati? Se stai per fare confronti di uguaglianza, idealmente vorrai indicizzare questa colonna. Ciò non è possibile se dichiari la colonna come qualcosa di più largo di 900 byte, anche se puoi aggiungere una colonna checksumo calcolata hashche può essere utilizzata per accelerare questo tipo di query.


21

Per favore prova questo

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

Anche questo è utile per poter vedere direttamente i dati nel campo TESTO se stai utilizzando alcuni strumenti come Toad per Sql Server che proteggono i campi di tipo BLOB per essere visti alla prima esecuzione. Puoi sempre fare clic sul campo per dire a Toad di mostrare il campo, ma è una procedura in due passaggi.
Roger

Nota che questo probabilmente renderà la tua query non classificabile .
Heinzi

13

Non puoi confrontare textcon l' =operatore, ma devi invece utilizzare una delle funzioni di confronto elencate qui . Nota anche la grande casella di avviso nella parte superiore della pagina, è importante.


5

Se non è possibile modificare il tipo di dati nella tabella stessa per utilizzare varchar (max), modificare la query in questo:

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

2

Non è quello che dice il messaggio di errore. Dice che non puoi usare l' =operatore. Prova ad esempio LIKE 'foo'.


Col IN ('foo', 'bar')è fondamentalmente lo stesso di Col = 'foo' or Col = 'bar'e avrà lo stesso problema.
Martin Smith

@ Martin: Grazie per il momento clou, non lo sapevo. Lo correggerò allora.
Will Marcouiller

0

Un'altra opzione potrebbe essere:

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

Sospetto che like 'foo'potrebbe fornire stime di cardinalità migliori rispetto a questo approccio, ma non ne sono sicuro al 100%.
Martin Smith

@ Martin: Dato che non puoi indicizzare una colonna TESTO, penso che ti ritroverai con una scansione completa della tabella in entrambi i casi.
Joe Stefanelli

Sono d'accordo, ma sarà comunque possibile utilizzare le statistiche sulla colonna per ottenere una stima delle righe che verranno restituiti che possa incidere unirsi decisioni ecc
Martin Smith

0

Funziona in MSSQL e MySQL:

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

1
OP sta usando MSSQL non MySQL.
Deckard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.