[Решено] Проблема с генерацией запроса SQL для поля varchar

Аватар пользователя divined divined 17 июля 2013 в 0:08

Возникла необходимость фильтровать по полю 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 = 'Диаметр')...

Комментарии

Аватар пользователя divined divined 17 июля 2013 в 1:26

Пробовал, не помогает.

Ну а как по другому выбрать цифровые значения между двумя величинами в поле типа varchar?

Аватар пользователя Kvark Kvark 17 июля 2013 в 4:00

Я конечно в друпал и бд чайник, но мне кажется что не так сравниваете, если это варчар то и сравнивать нужно как варчар, а не интегер - у вас же если правильно понял формат поля field_data_field_value.field_value_value не интегер, поэтому он в кавычки то и обрамляет, вы попробуйте что нить типа LIKE может?

тут еще гляньте может поможет: http://xandeadx.ru/blog/drupal/88

кстати можно еще попробовать конструкции IN и BETWEEN...

Аватар пользователя divined divined 17 июля 2013 в 4:06

Поле содержит смешанные значения. В том числе и текстовые.

Но надо отфильтровать по значению между 5 и 15, исключив текстовые значения.

Не могу придумать как это сделать с помощью оператора IN. Ведь число может быть еще и с плавающей.. А с BETWEEN таже фигня.

Аватар пользователя divined divined 17 июля 2013 в 13:40

Да знаю я все эти функции, но у меня же нет доступа у чистой 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'=')
);
?>
Аватар пользователя divined divined 17 июля 2013 в 15:00

Решение найдено:

<?php
$this
->query->add_where_expression(0"$table3.field_value_value >= $min AND $table3.field_value_value <= $max AND $table6.field_label_value = '$label'");
?>