crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Выбор строки. Данные для поиска вводятся в произвольном порядке., Firebird 2.1.3
Snake174
  опции профиля:
сообщение 27.9.2012, 5:24
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


Всем привет.
Например, в базе хранится строка "111 222 333", но пользователь может ввести "222 111 333", "333 222 111" и т.д. Как нужно составить запрос, чтобы в условии поиска можно было вводить данные в произвольном порядке? Cейчас сделано с помощью LIKE.
WHERE (LOWER(TEXT_MARK) LIKE '" + edit->text().toUtf8().toLower() + "')


Сообщение отредактировал Snake174 - 27.9.2012, 5:26
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 27.9.2012, 5:59
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Snake174 @ 27.9.2012, 11:24) *
Всем привет.
Например, в базе хранится строка "111 222 333", но пользователь может ввести "222 111 333", "333 222 111" и т.д. Как нужно составить запрос, чтобы в условии поиска можно было вводить данные в произвольном порядке? Cейчас сделано с помощью LIKE.
WHERE (LOWER(TEXT_MARK) LIKE '" + edit->text().toUtf8().toLower() + "')

вижу только разбивку по словам с тем же LIKE и OR
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Snake174
  опции профиля:
сообщение 28.9.2012, 6:56
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


Сделал так:
TextMark.clear();
TextMarkSearch.clear();
TextMark = edit->text().split(" ");
Generate(0);

for (register int i = 0; i < TextMarkSearch.count(); ++i)
{
  where += ("(LOWER(TEXT_MARK) LIKE '" + TextMarkSearch.at(i).toUtf8().toLower() + "') OR ");
}

where = where.left( where.length() - 4 );

TextMark и TextMarkSearch - QStringList.
void Generate( int k )
{
  if (k == TextMark.count())
  {
    QString str;

    for (register int i = 0; i < TextMark.count(); ++i)
      str += "%" + TextMark.at(i) + "% ";

    TextMarkSearch.append( str.trimmed() );
  }
  else
  {
    for (register int j = k; j < TextMark.count(); ++j)
    {
      TextMark.swap( k, j );
      Generate( k + 1 );
      TextMark.swap( k, j );
    }
  }
}


Сообщение отредактировал Snake174 - 28.9.2012, 6:57
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 28.9.2012, 7:08
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Snake174 @ 28.9.2012, 12:56) *
Сделал так:
TextMark.clear();
TextMarkSearch.clear();
TextMark = edit->text().split(" ");
Generate(0);

for (register int i = 0; i < TextMarkSearch.count(); ++i)
{
  where += ("(LOWER(TEXT_MARK) LIKE '" + TextMarkSearch.at(i).toUtf8().toLower() + "') OR ");
}

where = where.left( where.length() - 4 );

TextMark и TextMarkSearch - QStringList.
void Generate( int k )
{
  if (k == TextMark.count())
  {
    QString str;

    for (register int i = 0; i < TextMark.count(); ++i)
      str += "%" + TextMark.at(i) + "% ";

    TextMarkSearch.append( str.trimmed() );
  }
  else
  {
    for (register int j = k; j < TextMark.count(); ++j)
    {
      TextMark.swap( k, j );
      Generate( k + 1 );
      TextMark.swap( k, j );
    }
  }
}

так последний OR остается не закрытым
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Snake174
  опции профиля:
сообщение 28.9.2012, 7:11
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 89
Регистрация: 18.4.2011
Из: Миасс
Пользователь №: 2613

Спасибо сказали: 9 раз(а)




Репутация:   0  


Цитата
так последний OR остается не закрытым

Он у меня дальше по тексту обрезается. where = where.left( where.length() - 4 );

Сообщение отредактировал Snake174 - 28.9.2012, 7:12
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 28.9.2012, 7:32
Сообщение #6


Участник
**

Группа: Участник
Сообщений: 235
Регистрация: 3.8.2009
Из: Иркутск
Пользователь №: 982

Спасибо сказали: 28 раз(а)




Репутация:   2  


Цитата(Snake174 @ 28.9.2012, 13:11) *
Цитата
так последний OR остается не закрытым

Он у меня дальше по тексту обрезается. where = where.left( where.length() - 4 );

не посмотрел, пардон
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 26.4.2024, 19:26