Использование параметризованного SQL с предложением LIKE в WHERE (повсеместный SQL)
-
12-09-2019 - |
Вопрос
У меня есть обширная база данных, к которой я подключаюсь с помощью C ++.Все мои запросы до сих пор параметризованы, т.е "SELECT USER.NAME FROM USER WHERE USER.ID = ?"
,
и это прекрасно работает.Но в поисковом запросе я использую LIKE в предложении WHERE , и тогда кажется, что я не могу использовать параметры и подстановочные знаки (%).
Мой запрос выглядит примерно так "SELECT * FROM DOG WHERE DOG.NAME LIKE '%?%'"
и поскольку вокруг параметра есть два ' ?-mark , это не удается, выполняется поиск собак с ?-mark в их названии.В SQL Server это, вероятно, было бы решено путем объединения строки, подобной "SELECT * FROM DOG WHERE DOG.NAME LIKE '%' + ? + '%'"
, но это недопустимый синтаксис в Pervasive (см. Внизу этой страницы: http://ww1.pervasive.com/library/docs/psql/950/sqlref/sqlref-04-55.html).
Я также пытался добавить знаки % к самому параметру, но это, похоже, тоже не работает.
Кто-нибудь знает решение этой проблемы?
РЕДАКТИРОВАТЬ 1: Какой-нибудь пример кода на 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 в этом примере, чтобы они создавали sens здесь.)
Приведенный выше код вернет строку с собакой, у которой есть имя '%bob%'
, но я бы хотел, чтобы он вернул всех собак, в имени которых есть bob.
Решение
Почему бы вам не добавить подстановочный знак к значению , которое вы присваиваете параметру ?
Итак, это означает, что ваш запрос выглядит следующим образом
SELECT * FROM dog WHERE dog.name LIKE ?
А затем вы присваиваете значение '%bob%' этому параметру, например.Я вижу, вы говорите, что тоже пробовали это, но это не работает, что очень странно.Можете ли вы показать код того , что вы сделали тогда ?
Я также вижу, что вы заключили параметр в кавычки в одном из ваших примеров.Это не похоже на хорошую идею, так как тогда параметр больше не будет распознаваться как параметр.На этом этапе это просто строка.