Страница 1 из 1
Выбрать не пустые строки. HELP!
Добавлено: 13 фев 2006, 21:12
Эстет
В общем есть табличька в ней varchar(30) поле RETURN_DOCS.
На всем протяжении жизни таблички в неё добавляют редактируют и удаляют записи ... при этом RETURN_DOCS порой бывает NULL после добавления строки, но без занесения данных в RETURN_DOCS, ... также бывает просто пустой если данные в RETURN_DOCS потёрли ... ну соответствено забит буквенными данными. По RETURN_DOCS построенн индекс.
Требуется выбрать не пустые строки из всей таблицы.
У меня идея только делать так:
SELECT DOSTAVKA.RETURN_DOCS
FROM DOSTAVKA
WHERE
DOSTAVKA.RETURN_DOCS <> ''
но FB-1.5.3 строит план: PLAN (DOSTAVKA NATURAL)
Как правильно выбрать не пустые строки используя только индексные чтения ?
Добавлено: 13 фев 2006, 21:53
kdv
при неравенстве индекс не может быть использован никогда.
null <> '', также null <> null
Добавлено: 14 фев 2006, 01:39
Эстет
kdv писал(а):при неравенстве индекс не может быть использован никогда.
null <> '', также null <> null
Это понятно ... вопрос как быть ?
Добавлено: 14 фев 2006, 08:42
Ivan_Pisarevsky
А если триггером из пустой строки делать NULL-ы и искать
where some_field is not null
Добавлено: 14 фев 2006, 11:54
Эстет
Ivan_Pisarevsky писал(а):А если триггером из пустой строки делать NULL-ы и искать
where some_field is not null
Тоже самое .... индекс не используется ... но идея неплохая ... создам smalint поле return_docs_flag check in (0,1) попробую триггером его формировать .. если не пустое поле return_docs то в return_docs_flag капает 1 ... ну и потом выборку делать по return_docs_flag
Добавлено: 14 фев 2006, 13:55
kdv
и получить бесполезность такого столбца и индекса по нему в зависимости от соотношения количества записей с 0 и 1...
Добавлено: 14 фев 2006, 18:16
Эстет
kdv писал(а):и получить бесполезность такого столбца и индекса по нему в зависимости от соотношения количества записей с 0 и 1...
Хорошо ... твой вариант kdv ?
Добавлено: 15 фев 2006, 01:24
kdv
мой вариант? я таких баз не делаю.
Добавлено: 15 фев 2006, 09:10
Ivan_Pisarevsky
Эстет писал(а):Ivan_Pisarevsky писал(а):А если триггером из пустой строки делать NULL-ы и искать
where some_field is not null
Тоже самое .... индекс не используется ... но идея неплохая ... создам smalint поле return_docs_flag check in (0,1) попробую триггером его формировать .. если не пустое поле return_docs то в return_docs_flag капает 1 ... ну и потом выборку делать по return_docs_flag
Ну не null-ы, это я так навскидку не проверив... можно триггером null-ы и пустые строки менять на что-нидь вида "~ПОЛЕ_НЕ_ЗАПОЛНЕНО~" и никуда оно не денется отберется по индексу.
Re: Выбрать не пустые строки. HELP!
Добавлено: 15 фев 2006, 09:51
v6y
Эстет писал(а):В общем есть табличька в ней varchar(30) поле RETURN_DOCS.
На всем протяжении жизни таблички в неё добавляют редактируют и удаляют записи ... при этом RETURN_DOCS порой бывает NULL после добавления строки, но без занесения данных в RETURN_DOCS, ... также бывает просто пустой если данные в RETURN_DOCS потёрли ... ну соответствено забит буквенными данными. По RETURN_DOCS построенн индекс.
Требуется выбрать не пустые строки из всей таблицы.
У меня идея только делать так:
SELECT DOSTAVKA.RETURN_DOCS
FROM DOSTAVKA
WHERE
DOSTAVKA.RETURN_DOCS <> ''
но FB-1.5.3 строит план: PLAN (DOSTAVKA NATURAL)
Как правильно выбрать не пустые строки используя только индексные чтения ?
Я заранее прошу прощения - может чего с просонья не разобрал. Но почему нельзя использованть
Код: Выделить всё
SELECT DOSTAVKA.RETURN_DOCS
FROM DOSTAVKA
WHERE
DOSTAVKA.RETURN_DOCS > ''
?
Добавлено: 15 фев 2006, 11:38
Ivan_Pisarevsky
Попробовал... да, таки индейская избушка фигвам...
Предлагаю выделить это поле в отдельную табличку, соответственно связь по ключу, как обычно. Если запись пустая, то в этой вспомогательной табличке вообще не должно быть записи. Дальше отбор иннер джойном, соответсвенно сделать внешний ключ, индекс по нему создастся автоматом, ну думаю мысль ясна.
Добавлено: 15 фев 2006, 12:10
v6y
Ivan_Pisarevsky писал(а):Попробовал... да, таки индейская избушка фигвам...
Предлагаю выделить это поле в отдельную табличку, соответственно связь по ключу, как обычно. Если запись пустая, то в этой вспомогательной табличке вообще не должно быть записи. Дальше отбор иннер джойном, соответсвенно сделать внешний ключ, индекс по нему создастся автоматом, ну думаю мысль ясна.
Ну не дайте же умереть дураком! Ну обясните чего вы тут огород городите, если индекс чеплятся, когда вместо
неравно используется
больше и при этом ни null, ни пустые строки не отображаются?
Добавлено: 15 фев 2006, 15:28
Ivan_Pisarevsky
Да, если "больше", то отбор идет по индексу...
просто в моей голове слехка не вяжется логически "что это за сущность", которая больше пустой строки... Может гуру просвятят?
Добавлено: 15 фев 2006, 21:26
v6y
Ivan_Pisarevsky писал(а): в моей голове слехка не вяжется логически "что это за сущность", которая больше пустой строки...
Смотрите на вещи проще

Это строки с одним и более непробельных символов

Добавлено: 16 фев 2006, 12:22
Merlin
Это всё лирика. Самое-то интересное - для нафига надо стараться выбрать непустые строки именно по индексу... Видать там 90% пустых. Или нужно обязательно добиться замедления запроса...