Возникла необходимость фильтровать по полю varchar.
Но есть проблема: при генерации запроса друпал обрамляет значения в апострофы и это неправильно сказывается на результате.
Что делаю:
<?php
$this->query->add_where(0,
db_and()
->condition($table3.".field_value_value", min($value), '>=')
->condition($table3.".field_value_value", max($value), '<=')
->condition($table6.".field_label_value", $label, '=')
);
?>
Получаю:
WHERE ((( (field_data_field_value.field_value_value >= '14') AND (field_data_field_value.field_value_value <= '22') AND (field_data_field_label.field_label_value = 'Длина') )AND( (field_data_field_value_1.field_value_value >= '5') AND (field_data_field_value_1.field_value_value <= '13') AND (field_data_field_label_1.field_label_value = 'Диаметр')...
И соответственно неверный результат.
Как заставить друпал генерировать запрос без обрамления значений, как будто это целые числа?
WHERE ((( (field_data_field_value.field_value_value >= 14) AND (field_data_field_value.field_value_value <= 22) AND (field_data_field_label.field_label_value = 'Длина') )AND( (field_data_field_value_1.field_value_value >= 5) AND (field_data_field_value_1.field_value_value <= 13) AND (field_data_field_label_1.field_label_value = 'Диаметр')...
Комментарии
Можно попробовать
(int) min($value)
Однако рекомендую задуматься, правильно ли это
Пробовал, не помогает.
Ну а как по другому выбрать цифровые значения между двумя величинами в поле типа varchar?
Я конечно в друпал и бд чайник, но мне кажется что не так сравниваете, если это варчар то и сравнивать нужно как варчар, а не интегер - у вас же если правильно понял формат поля field_data_field_value.field_value_value не интегер, поэтому он в кавычки то и обрамляет, вы попробуйте что нить типа LIKE может?
тут еще гляньте может поможет: http://xandeadx.ru/blog/drupal/88
кстати можно еще попробовать конструкции IN и BETWEEN...
Поле содержит смешанные значения. В том числе и текстовые.
Но надо отфильтровать по значению между 5 и 15, исключив текстовые значения.
Не могу придумать как это сделать с помощью оператора IN. Ведь число может быть еще и с плавающей.. А с BETWEEN таже фигня.
ЕМНИП, можно попробовать захерачить туда модуль числа.
т.е.
WHERE ((( (ABS(field_data_field_value.field_value_value) >= 14)
Попробуйте
http://dev.mysql.com/doc/refman/5.0/en/cast-functions.html#function_convert
Да знаю я все эти функции, но у меня же нет доступа у чистой SQL строке чтобы их туда поставить. Мне нужно с помощью идиотского db_select это провернуть.
Вот я и спрашиваю, что можно сделать с:
<?php
$this->query->add_where(0,
db_and()
->condition($table3.".field_value_value", min($value), '>=')
->condition($table3.".field_value_value", max($value), '<=')
->condition($table6.".field_label_value", $label, '=')
);
?>
обернуть в CONVERT?
Решение найдено:
<?php
$this->query->add_where_expression(0, "$table3.field_value_value >= $min AND $table3.field_value_value <= $max AND $table6.field_label_value = '$label'");
?>