CONVERT не работет в WHERE | |
---|---|
lili Автор Сообщений: 435 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Приветствую всех!
Столкнулась с такой непонятностью. В таблице tblFiles поле content типа varbinary(max). Следующий запрос срабатывает влет:
Мне нужно выявить записи с заполненным полем content. Ставлю ту же формулу в WHERE и не могу дождаться результата:
|
Re: CONVERT не работет в WHERE | |
---|---|
lili Автор Сообщений: 435 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
забыла сказать - запросы на SQL-сервер
|
Re: CONVERT не работет в WHERE | |
---|---|
of63 Сообщений: 25244 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
isnull() что возвращает?
|
Re: CONVERT не работет в WHERE | |
---|---|
PaulWist Сообщений: 14614 Дата регистрации: 01.04.2004 |
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) Исправлено 1 раз(а). Последнее : PaulWist, 24.03.17 13:38 |
Re: CONVERT не работет в WHERE | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Отлично. Цитата:Может быть в том, что строки начинаются с пробела? Пустота и пробел - разные вещи. Проверки на не равность пробелу и на пустоту - тоже разные, хотя иногда и очень похожи. ------------------ Лень - это неосознанная мудрость. |
Re: CONVERT не работет в WHERE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В том что такой запрос не оптимизируется. Есть большая разница между тем чтобы "извлечь 100 произвольных записей и в каждой из них вычислить выражение" и "извлечь записи в которых выражение такое-то, и из них отобрать 100". Оптимизатор может "не понять" твоего желания и начать обрабатывать всю таблицу целиком. Нужно использовать оптимизируемые выражения, а в случае невозможности (но тут не похоже на такой случай) таки "ждать часами". И да, ещё, запросы с TOP не имеют практического смысла (в продуктивной системе) в отсутствии опции упорядочения. 100 КАКИХ записей? Произвольных? Тех которым повезло пораньше попасть на обработку серверу Ну такое, наверное, бывает в жизни - 1 раз из миллиона - и это ОЧЕНЬ специфические случаи Гораздо чаще нужно 100 записей из выборки упорядоченной по определённым критериям. Т.е. нужна опция ORDER BY. Конечно же для тестирования и тому подобных целей можно и без ORDER обойтись - просто не забывать что это 100 абы каких записей - не "первых", не "последних" - просто произвольно отрезанный кусок выборки. ------------------ WBR, Igor |
Re: CONVERT не работет в WHERE | |
---|---|
lili Автор Сообщений: 435 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
TOP я использовала для уменьшения запроса, он тут не суть.
Есть таблица документов docum и связанных с документов файлов tblFiles. Я хочу выявить документы, в которых не записался связанный файл, то есть не заполнилось поле content. И на самом деле запрос выглядит так:
|
Re: CONVERT не работет в WHERE | |
---|---|
lili Автор Сообщений: 435 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Еще добавлю:
- запрос прекрасно работал на SQL-2008 - после переноса базы на другой сервер SQL-2008+sp1 работать перестал |
Re: CONVERT не работет в WHERE | |
---|---|
PaulWist Сообщений: 14614 Дата регистрации: 01.04.2004 |
1. Зачем оптимизатор "напрягать" опцией index ?
2. Что значит "не записался" связанный файл? Поле content может содержать space(1)? Если не может, то сделать ему content varbinary(max) not null. 3. Добавить в таблицу tblFiles вычисляемое поле:
4. Создать по ContentCompute индекс
5. Тогда, запрос упроститься до безобразия:
------------------ Есть многое на свете, друг Горацио... Что и не снилось нашим мудрецам. (В.Шекспир Гамлет) Исправлено 2 раз(а). Последнее : PaulWist, 24.03.17 15:23 |
Re: CONVERT не работет в WHERE | |
---|---|
lili Автор Сообщений: 435 Откуда: Сыктывкар Дата регистрации: 07.11.2005 |
Во-первых, спасибо за идею вычисляемого поля. А во-вторых, предложенная Вами проверка длины, а не содержимого поля сама по себе прекрасно сработала. Еще раз спасибо. |
Re: CONVERT не работет в WHERE | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Ну так надо оптимизировать тот запрос который НАДО, а не то что "кажется похожим"
Для начала какой тип у поля content, допустимы ли для него NULL-ы и что является "не заполненностью" - NULL в этом поле, пустая строка (НЕ "один пробел"), или строка из одних лишь пробелов (плюс, возможно, другие "невидимые символы" - табуляторы, переводы строки и т.п.) Исходя из этого и надо будет строить запрос. И я на 99% уверен что в этом запросе не нужно будет никаких exists подзапросов, и тем паче явных конвертаций вида convert(varchar(1),t.content),' '). Банально join этих 2-х таблиц и условие типа content is null или, возможно, content is null or DATALENGTH(content) = 0 - если "пустой но не null" тоже нужно отыскивать. ------------------ WBR, Igor |
© 2000-2024 Fox Club  |