WHERE 句で LIKE を使用したパラメータ化された SQL の使用 (Pervasive SQL)
-
12-09-2019 - |
質問
C++ を使用して接続する Pervasive データベースがあります。これまでの私のクエリはすべてパラメータ化されています。 "SELECT USER.NAME FROM USER WHERE USER.ID = ?"
、それは正常に機能します。しかし、検索クエリで WHERE 句で LIKE を使用すると、パラメーターとワイルド文字 (%) を使用できないようです。
私のクエリは次のようになります "SELECT * FROM DOG WHERE DOG.NAME LIKE '%?%'"
パラメータ ?-mark の周りに 2 つの ' があるため、これは失敗し、名前に ?-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 テーブルの名前を変更しました。)
上記のコードは、次の名前の犬を含む行を返します。 '%bob%'
, 、ただし、名前に bob が含まれるすべての犬を返したいと考えています。
解決
なぜあなたはパラメータに代入している値にワイルドカードを追加しないのですか?
だから、これは意味し、あなたのクエリは、
のようになります。SELECT * FROM dog WHERE dog.name LIKE ?
そして、あなたは、例えば、このパラメータに値「%ボブ%」を割り当てます。 私はあなたがあなたにもこれを試してみたと言う見、それは非常に奇妙である、動作しません。あなたはあなたが何をやったかのコードを表示することができますか?
私はまた、あなたの例の一つに、パラメータの前後に引用符を入れていることがわかります。その後、パラメータはもう、パラメータとして認識されませんので、これは良いアイデアのような音はありません。その時点で、それは単なる文字列です。