56

列が存在する場合は列の値を選択し、それ以外の場合は null を選択できるかどうか疑問に思っています。言い換えれば、列が存在しない場合を処理するために select ステートメントを「持ち上げ」たいと思います。

SELECT uniqueId
    ,  columnTwo
    ,  /*WHEN columnThree exists THEN columnThree ELSE NULL END*/ AS columnThree
FROM (subQuery) s

注意してください、私はデータ モデルと設計を固める途中です。今後数週間のうちにこのロジックを除外したいと考えていますが、データ モデルの修正は今取り組むよりも時間のかかる作業であるため、この問題を解決したいと考えています。

また、これを 1 つのクエリで実行できるようにしたいと考えています。だから私は次のような答えを探していません

最初にサブクエリにある列を確認してください。次に、クエリを変更して、サブクエリの列を適切に処理します。

4

3 に答える 3

33

これは、単純な SQL ステートメントでは実行できません。すべてのテーブルおよびテーブル内の列参照が存在しない限り、SQL クエリはコンパイルされません。

「サブクエリ」がテーブル参照またはビューである場合、動的 SQL でこれを行うことができます。

動的 SQL では、次のようにします。

declare @sql nvarchar(max) = '
SELECT uniqueId, columnTwo, '+
    (case when exists (select *
                       from INFORMATION_SCHEMA.COLUMNS 
                       where tablename = @TableName and
                             columnname = 'ColumnThree' -- and schema name too, if you like
                      )
          then 'ColumnThree'
          else 'NULL as ColumnThree'
     end) + '
FROM (select * from '+@SourceName+' s
';

exec sp_executesql @sql;

実際のサブクエリの場合、サブクエリがその列名で何かを返したかどうかを確認することで、同じことを近似できます。これを行う 1 つの方法は、クエリを実行してから select top 0 * into #temp from (<subquery>) s、 で列をチェックすること#tempです。

編集:

私は通常、そのような古い質問を更新しませんが、以下のコメントに基づいています。「サブクエリ」の各行に一意の識別子がある場合は、次を実行できます。

select t.. . .,  -- everything but columnthree
       (select column3   -- not qualified!
        from t t2
        where t2.pk = t.pk
       ) as column3
from t cross join
     (values (NULL)) v(columnthree);

サブクエリはcolumn3、存在しない場合、外側のクエリから取得します。ただし、これは、各行に一意の識別子があることに大きく依存します。問題は明らかにサブクエリに関するものであり、行が簡単に一意に識別されると期待する理由はありません。

于 2013-06-06T01:44:53.843 に答える