Пункт WHERE для типу даних "Текстовий" SQL Server


90

Де [CastleType] встановлено як тип даних "текст" у SQL Server, а запит:

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

Я отримую помилку:

Типи даних TEXT та VARCHAR несумісні в операторі дорівнює.

Чи не можу я запитати цей тип даних за допомогою речення WHERE?


9
Використовуйте VARCHAR(MAX)замість TEXT- цей тип даних застарілий
marc_s

Відповіді:


101

Ви можете використовувати LIKEзамість =. Без будь-яких символів підстановки це матиме той самий ефект.

DECLARE @Village TABLE
        (CastleType TEXT)

INSERT INTO @Village
VALUES
  (
    'foo'
  )

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

textзастаріло. Змінити на varchar(max)буде легше працювати.

Також наскільки великими можуть бути дані? Якщо ви збираєтеся робити порівняння рівності, в ідеалі ви захочете проіндексувати цей стовпець. Це неможливо, якщо ви оголосите стовпець як щось ширше 900 байт, хоча ви можете додати обчислюваний checksumабо hashстовпець, який можна використовувати для прискорення цього типу запиту.


20

Будь ласка, спробуйте це

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

Це також корисно, щоб мати можливість безпосередньо бачити дані в полі ТЕКСТ, якщо ви використовуєте деякі інструменти, такі як Toad for Sql Server, які захищають поля типу BLOB, які видно при першому виконанні. Ви завжди можете натиснути поле, щоб сказати Жабі показати поле, але це двоетапна процедура.
Роджер

Зауважте, що це, ймовірно, зробить ваш запит не підданим упорядкуванню .
Heinzi

13

Ви не можете порівнювати textз =оператором, але натомість повинні використовувати одну з перелічених тут функцій порівняння . Також зверніть увагу на велике попереджувальне поле у ​​верхній частині сторінки, це важливо.


5

Якщо ви не можете змінити тип даних у самій таблиці, щоб використовувати varchar (max), змініть свій запит на такий:

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

2

Не в повідомленні про помилку йдеться. Там сказано, що ви не можете користуватися =оператором. Спробуйте, наприклад LIKE 'foo'.


Col IN ('foo', 'bar')в основному те саме, що Col = 'foo' or Col = 'bar'і матиме ту ж проблему.
Martin Smith

@Martin: Дякую за висвітлення, я не знав про це. Тоді я це виправлю.
Will 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 використовує MSSQL, а не MySQL.
Deckard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.