10

SQL Server または MS Access をデータ ストアとして使用できるプロジェクトがあります。1 つの SELECT ステートメントで、次のように、1 つの列と 1 つの値に対して COALESCE 操作を実行する必要があります。

SELECT COALESCE([Amount], 0) FROM PaymentsDue;

SQL Server と MS Access の両方で正しく実行される単一の SQL ステートメントを作成したいと考えています。すぐに関心のある SQL Server のバージョンは 2008 ですが、バージョン間で適用可能なソリューションが望ましいでしょう。

今日、誰かがSQL トリックを教えてくれました。これにより、単一の SELECT ステートメントを使用して DATETIME を DATE に効果的にキャストできました。SQL Server と MS Accessの両方に適用できる方法で COALESCE (IFNULL または NZ など) 操作を実行する同様のトリックを誰かが持っているかどうか疑問に思っていましたか?

4

4 に答える 4

7

両方のプラットフォームで同じように機能する構文はないと思います。

メモNz()は、Access ユーザー インターフェイスを使用している場合にのみ使用できます。

COALESCE列を繰り返すのは面倒ですが、かなり簡単に変換できるいくつかの提案を次に示します。

サンプル 1:

SELECT IIF([Amount] IS NULL, 0, [Amount]) FROM PaymentsDue;

サンプル 2:

SELECT SWITCH([Amount] IS NULL, 0, TRUE, [Amount]) FROM PaymentsDue;
于 2011-10-27T09:17:12.577 に答える
5

モジュールにカスタムパブリック関数を作成します。

Public Function COALESCE(InputValue, ValueIfNull)
   COALESCE = nz(InputValue, ValueIfNull)
End Function

エラー処理などを追加し、改善します。

COALESCEこれで、 MSAccessとSQLでこの関数を使用できるようになります。

于 2012-08-17T20:21:46.013 に答える
0

そして、Jet SQL と T-SQL の間の変換を管理するパーサーを書きたくないでしょう...

私たちが開発した解決策 (そうです、解決すべき同様の問題がありました) は、メタ SQL 構文で使用する「疑似メタ言語」を定義することであり、このメタ言語から Jet SQL への一種のトランスレータがあります。またはT-SQL。

例:

myQuery = "SELECT @MyCoalesceFunction@([Amount], 0) FROM PaymentsDue;"

myQuery = convertFromMeta(myQuery,"T-SQL")
will give
    "SELECT COALESCE([Amount], 0) FROM PaymentsDue;"

myQuery = convertFromMeta(myQuery,"JET-SQL")
will give
    "SELECT NZ([Amount], 0) FROM PaymentsDue;"

ワイルドカードと区切り文字にも同じ戦略を使用できます。

myQuery = "SELECT [Amount] FROM PaymentsDue WHERE id_client LIKE @CarSep@ABC@MyWildCard@@CarSep@"

myQuery = convertFromMeta(myQuery,"T-SQL")
will give
    "SELECT [Amount] FROM PaymentsDue  WHERE id_client LIKE 'ABC%'"

myQuery = convertFromMeta(myQuery,"JET-SQL")
will give
    "SELECT [Amount] FROM PaymentsDue  WHERE id_client LIKE "ABC%""

それほど良くないことはわかっていますが、非常に効率的でクリーンです。主なポイントは次のとおりです。

  • Jet と T-SQL 間の変換ではなく、「メタ構文」からの変換です。それは物事をずっと簡単にします
  • 関数が同じ数のパラメーターを持っていない場合、またはパラメーターが同じ順序で渡されていない場合は、非常に注意する必要があります。それはまだできる...
  • メタ構文は、対応する文字列 ('@MyWildCard@' や '@CarSep@' など) が構文に固有であり、データ値として使用できないという事実に依存しています (そうしないと、いくつかの 'meta-注射の危険!...)
于 2011-10-28T12:47:35.593 に答える