2017-04-07 18 views
0

一部のお客様は古いデータベースを使用していますが、新しい顧客用に別の列を追加する必要があります。私のプログラムは、新しい列がある場合はこれを照会し、そうでない場合はNULLを使用します。SQL - OLEQueryに列が存在する場合は選択

C#とOLEQueryこれは、これまでに取り組んでいるの使用:

string sql = @"SELECT i.[ID] AS cID, 
         pg.[Name], 
         pg.[ID] AS pgid, 
         i.[time], 
         defect = CASE i.[defect] WHEN 0 THEN 'OK' WHEN 1 THEN 'NOK' END,           
        FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
        WHERE i.[time] BETWEEN ... ///SOME MORE CODE IS FOLLOWING HERE! 
        "; 

をしかし、今、私はこれに(/ない場合もあり)既存の列timeToを追加したいです。

string sql = @"SELECT i.[ID] AS cID, 
         pg.[Name], 
         pg.[ID] AS pgid, 
         i.[time], 
         defect = CASE i.[defect] WHEN 0 THEN 'OK' WHEN 1 THEN 'NOK' END,      
         timeTo = CASE i.[timeTo] WHEN EXISTS THEN i.[timeTo] ELSE NULL END      
        FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
        WHERE i.[time] BETWEEN ... //SOME MORE CODE IS FOLLOWING HERE! 
        "; 

この「存在する」キーワードは難しいですが、「1行」解決策はありますか?私はいくつかのケース選択ソリューションを見つけました。このソリューションを必要とするので、異なる列のいくつかの場所でケース選択ソリューションが適合しません。 ご協力ありがとうございます

+0

どのrdbmsを使用していますか?例えばsql-server、mysqlなど? – BeanFrog

+0

申し訳ありませんが、それはsql-serverです。 –

+0

'exists'によって、' null'ではないのですか? – JohnHC

答えて

1

SQL Serverでは、存在しないフィールドを参照することはできません。これは、クエリオプティマイザが存在しないフィールドを含む実行計画を生成できないためです。

アプリはにする必要があります:それはで作業しているDBのバージョンを確認し

  1. 適切なクエリを選択します。
  2. 新しいフィールドに依存する機能を無効にするか、適切な既定値を選択して、欠落しているデータを処理していることを確認します。
0

if文を実行してシステムテーブルを照会することができます。これを解析するには、動的SQLでこれを行う必要があります。

declare @sql nvarchar(max); 

if exists (
    select 1 from sys.columns c 
    inner join sys.tables t on c.object_id = t.object_id 
    where c.name = 'timeTo' and t.name = 'inspection') 
begin 
    set @sql = 'SELECT i.[ID] AS cID, 
     pg.[Name], 
     pg.[ID] AS pgid, 
     i.[time], 
     defect = CASE i.[defect] WHEN 0 THEN ''OK'' WHEN 1 THEN ''NOK'' END,      
     timeTo = CASE i.[timeTo] WHEN EXISTS THEN i.[timeTo] ELSE NULL END      
    FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
    WHERE i.[time] BETWEEN ... //SOME MORE CODE IS FOLLOWING HERE!'; 
end 
else 
begin 
    set @sql = 'SELECT i.[ID] AS cID, 
     pg.[Name], 
     pg.[ID] AS pgid, 
     i.[time], 
     defect = CASE i.[defect] WHEN 0 THEN ''OK'' WHEN 1 THEN ''NOK'' END,           
    FROM inspection AS i WITH (NOLOCK) INNER JOIN programs as pg ON i.programid = pg.[ID] 
    WHERE i.[time] BETWEEN ... ///SOME MORE CODE IS FOLLOWING HERE!'; 
end 
exec (@sql); 
+0

ありがとうございます!私は今のようなことをやったことがありますが、私はよりエレガントな方法(コードのワン・ライン・ソリューション)を望んでいます。 –

関連する問題