Использование параметризованного SQL с LIKE в предложении WHERE (распространяющийся SQL) - PullRequest
4 голосов
/ 10 июля 2009

У меня есть база данных Pervasive, к которой я подключаюсь с использованием C ++. Все мои запросы пока что параметризованы, т.е. "SELECT USER.NAME FROM USER WHERE USER.ID = ?", и это прекрасно работает. Но в поисковом запросе я использую LIKE в предложении WHERE, а затем кажется, что я не могу использовать параметры и подстановочные знаки (%).

Мой запрос выглядит примерно так: "SELECT * FROM DOG WHERE DOG.NAME LIKE '%?%'", и, поскольку вокруг параметра? - два символа «два», это не удается, он искал собак с? -Маркой в ​​их имени. В SQL Server это, вероятно, будет решено путем объединения строки, такой как "SELECT * FROM DOG WHERE DOG.NAME LIKE '%' + ? + '%'", но это недопустимый синтаксис в Pervasive (см. Внизу этой страницы: http://ww1.pervasive.com/library/docs/psql/950/sqlref/sqlref-04-55.html).

Я также пытался добавить% -signs к самому параметру, но, похоже, это тоже не сработало.

Кто-нибудь знает решение этой проблемы?

EDIT1: Пример кода C ++:

CString sqlCommand = "SELECT * FROM DOG WHERE DOG.NAME LIKE ?;";
m_pAdoCommand->CommandText = _bstr_t(sqlCommand);
m_pAdoCommand->Parameters->Append( m_pAdoCommand->CreateParameter("p0", adVarChar, adParamInput, 25, _bstr_t("'%bob%'")) );
m_pAdoRecordset = m_pAdoCommand->Execute(NULL,NULL,adCmdText);

(m_pAdoCommand - это _CommandPtr, а m_pAdoRecordset - это _RecordsetPtr. Я изменил имя таблиц SQL в этом примере, чтобы они имели смысл здесь.)

Приведенный выше код вернет строку с собакой с именем '%bob%', но я бы хотел, чтобы она возвращала всех собак с бобом в их имени.

1 Ответ

6 голосов
/ 10 июля 2009

Почему бы вам не добавить подстановочный знак к значению, которое вы назначаете параметру?

Итак, это означает, что ваш запрос выглядит как

SELECT * FROM dog WHERE dog.name LIKE ?

И затем вы назначаете значение «% bob%», например, этому параметру. Я вижу, вы говорите, что вы тоже это попробовали, но это не работает, что очень странно. Можете ли вы показать код того, что вы сделали тогда?

Я также вижу, что вы помещаете кавычки вокруг параметра в одном из ваших примеров. Это не очень хорошая идея, так как с тех пор параметр больше не будет распознаваться как параметр. В этот момент это просто строка.

...