2017-04-07 51 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! 
        "; 

我知道使用這個「存在」關鍵字很困難,但是有沒有「單行」解決方案?我發現了其他幾種案例選擇解決方案由於我需要在具有不同列的幾個地方使用此解決方案,因此案例選擇解決方案不適合。 感謝您的幫助

+0

您使用哪種rdbms?例如sql-server,mysql或其他東西? – BeanFrog

+0

對不起,它是sql-server。 –

+0

「存在」,你的意思是不是'null'? – JohnHC

回答

1

SQL Server不會允許您引用不存在的字段。我懷疑這是因爲查詢優化器無法生成包含不存在的字段的執行計劃。

您的應用程序將需要:

  1. 識別它正在與該數據庫的版本。
  2. 選擇適當的查詢。
  3. 確保它處理丟失的數據(通過關閉依賴新字段的功能或通過選擇適當的默認值)。
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

是的,謝謝!我現在做了這樣的事情 - 但我希望/尋找更優雅的方式(單行代碼解決方案)。 –