これは少し理論的な答えですが、役立つかもしれません。短いバージョンは「クエリでパラメーターを使用する」ですが、詳細を理解するのに役立ちます。
標準 SQL では、文字列は単一引用符で囲まれ、埋め込まれた単一引用符は 2 つの単一引用符で表されます。
SELECT * FROM SomeWhere
WHERE SomeThing = 'He said, "Don''t do it!"';
一部の SQL 方言では、代わりに文字列を二重引用符で閉じることができます。二重引用符の単一のインスタンスを埋め込むには、二重引用符を二重にする必要があります。
SELECT * FROM SomeWhere
WHERE SomeThing = "He said, ""Don't do it!""';
会社名に外側の二重引用符と中央の二重引用符が含まれているのか、それとも中央の二重引用符だけが含まれているのかは、質問からは明らかではありません。ただし、原則としてルールは同じです。3 つの二重引用符がすべて必要であり、SQL で単一引用符を使用すると仮定すると、このコンテキストでははるかに簡単になります。
SELECT c.companyID, c.companyName, c.dateAdded, count(cm.maxID) as NumDirect
FROM RussoundGeneral.dbo.Company c
LEFT JOIN RussoundGeneral.dbo.CompanyMax cm
ON (cm.companyId = c.companyId and cm.maxID is not null)
WHERE CONTAINS ( companyName, '"BLAH "BLAHBLAH" Ltd.' )
GROUP BY c.companyID, c.companyName, c.dateAdded
ORDER BY c.companyName ASC;
二重引用符の使用:
SELECT c.companyID, c.companyName, c.dateAdded, count(cm.maxID) as NumDirect
FROM RussoundGeneral.dbo.Company c
LEFT JOIN RussoundGeneral.dbo.CompanyMax cm
ON (cm.companyId = c.companyId and cm.maxID is not null)
WHERE CONTAINS ( companyName, """BLAH ""BLAHBLAH"" Ltd." )
GROUP BY c.companyID, c.companyName, c.dateAdded
ORDER BY c.companyName ASC;
プログラミング言語で文字列を作成している場合は、プログラミング言語で文字列を評価するものを超えてこれらの引用符を取得することについて心配する必要があります。たとえば、C で文字列リテラルを作成する場合は、二重引用符をバックスラッシュでエスケープする必要があります。
static const char sql_stmt[] =
"SELECT c.companyID, c.companyName, c.dateAdded,\n"
" COUNT(cm.maxID) AS NumDirect\n"
" FROM RussoundGeneral.dbo.Company c\n"
" LEFT JOIN RussoundGeneral.dbo.CompanyMax cm\n"
" ON (cm.companyId = c.companyId AND cm.maxID IS NOT NULL)\n"
" WHERE CONTAINS(companyName, \"\"\"BLAH \"\"BLAHBLAH\"\" Ltd.\")\n"
" GROUP BY c.companyID, c.companyName, c.dateAdded\n"
" ORDER BY c.companyName ASC";
一方、ユーザーから会社名などのデータを読み取る場合は、読み取った内容が正しく引用されていることを確認する必要があります。
「パラメーターを使用する」と言った人は正しいです。これははるかに簡単で信頼性が高く、SQL インジェクション攻撃に対して脆弱ではありません (まだ見ていない場合は、XKCDを参照してください)。しかし、基礎を理解していれば、システムの実際の要件に適応できます。
最後の注意: 標準 SQL では、二重引用符で「区切り識別子」を囲みます。つまり、二重引用符で囲まれた名前は、文字列リテラルとしてではなく、データベース内の何かの名前として扱われる必要があります。MS SQL Server では、[角括弧] は同じ目的を果たします。角かっこの間にあるのは、列の名前またはデータベース内の名前です。多くのシステムはそれよりも柔軟です。標準からどのように逸脱するかという点で、すべてのシステムが同じというわけではありません。