2

select が常に 1 つの行を返すようにするという非常にユニークな必要性があります。

私のSQL:

select * from table1 Where (table1.pk = :p1) or (table1.fk1 = :p1)

上記の SQL には、常に次の 2 つのケースが返されます。

1- my Select は 2 つのレコードを返します。唯一の違いは、レコードの 1 つにデータがあり、もう 1 つのレコードにはデータが入力された ID のみがあり、残りのフィールドは null であることです。この場合、他のフィールドにデータがあるものだけを返す必要があります。

2- my Select return one record この場合、返されたレコードにはデータが入力された ID フィールドのみが含まれ、残りのフィールドは null ですが、これは私が望むものであり、それ以上の処理は必要ありません。

1 つのプレーンな Select SQL でそれを行うことが可能かどうかアドバイスしてください。ストアド プロシージャを使用できません。

4

1 に答える 1

3

ステートメントのfirst句を使用して、 1行のみを取得できます。select

特定の条件を前提として、結果セットを残りのフィールドの降順で並べ替えて、データ行がない場合にのみnull行が選択されるようにすることができます(Firebird 2.5ではnullが最初になりますが、これは最後のバージョンのどこかで変更されました、したがって、これを適用する前に特定のバージョンを確認してください)。

最終的なクエリは次のようになります。

select first 1 * 
  from table1 
 where (table1.pk = :p1) 
    or (table1.fk1 = :p1)
 order by somecolumn;

somecolumnnull値を含むことができる他のフィールドの中で最も関連性があります。

次のステートメントでこれをテストできます。

--two rows, one with ID and values and the other with ID and null
with q1 as (
      select 1 id, 'data' othercolumn
        from rdb$database
      union
      select 2 id, null othercolumn
        from rdb$database
     ) 
select first 1 *
  from q1
 order by othercolumn nulls last;

--versus:

--onw row with ID and null
with q1 as (
      select 2 id, null othercolumn
        from rdb$database
     ) 
select first 1 *
  from q1
 order by othercolumn nulls last;
于 2013-01-22T04:08:27.633 に答える