2011-10-19 118 views
1

我有6個表:LS_CLIENT_INSEE_A,B,C等。每個表只包含1個字段:INSEE。SQL CASE SELECT返回字符

我只想知道我的輸入是否存在於其中一個表中,並從表名(A,B,C等)返回相應的字母。

是否有其他原因重寫此:

@TheInsee int 
AS 
BEGIN 
declare @Zone char(1) 

declare @CountA int 
declare @CountB int 
declare @CountC int 
declare @CountD int 
declare @CountF int 
declare @CountP int 

SELECT @CountA = COUNT(*) FROM LS_CLIENT_INSEE_A WHERE NO_INSEE = @TheInsee 
SELECT @CountB = COUNT(*) FROM LS_CLIENT_INSEE_B WHERE NO_INSEE = @TheInsee 
SELECT @CountC = COUNT(*) FROM LS_CLIENT_INSEE_C WHERE NO_INSEE = @TheInsee 
SELECT @CountD = COUNT(*) FROM LS_CLIENT_INSEE_D WHERE NO_INSEE = @TheInsee 
SELECT @CountF = COUNT(*) FROM LS_CLIENT_INSEE_F WHERE NO_INSEE = @TheInsee 
SELECT @CountP = COUNT(*) FROM LS_CLIENT_INSEE_P WHERE NO_INSEE = @TheInsee 

set @Zone = 
     CASE 
     WHEN @CountA > 0 THEN 'A' 
     WHEN @CountB > 0 THEN 'B' 
     WHEN @CountC > 0 THEN 'C' 
     WHEN @CountD > 0 THEN 'D' 
     WHEN @CountF > 0 THEN 'F' 
     WHEN @CountP > 0 THEN 'P'   
     END 

END 

是上面的查詢實現這一目標的最佳途徑?

感謝你在前進, 甜菊

+0

我建議你考慮規範化這個數據庫! – Simon

回答

2

這應該通過停止選擇,一旦它發現一個打擊工作,最壞的情況下仍然會當它在無其中。

注:假設SQL服務器(區別是TOP 1相比LIMIT 1):

@TheInsee int 
AS 
BEGIN 
declare @Zone char(1) 

SELECT @Zone = 
     CASE 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_A WHERE NO_INSEE = @TheInsee) > 0 THEN 'A' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_B WHERE NO_INSEE = @TheInsee) > 0 THEN 'B' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_C WHERE NO_INSEE = @TheInsee) > 0 THEN 'C' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_D WHERE NO_INSEE = @TheInsee) > 0 THEN 'D' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_F WHERE NO_INSEE = @TheInsee) > 0 THEN 'F' 
     WHEN (SELECT TOP 1 1 FROM LS_CLIENT_INSEE_P WHERE NO_INSEE = @TheInsee) > 0 THEN 'P'  
     END 
END 

TOP 1 1是一個快捷方式,以防止它掃描整個表,如果NO_INSEE沒有被索引和表這是很重要很大,它會在第一次點擊時停止,並且不會繼續掃描整個表格。

+0

它會在找到命中後停止處理額外的表格,但在發現命中後需要使用'EXISTS'來停止處理當前表格。 –

+0

的確,在不知道RDMS的情況下,我無法決定是否應該使用'SELECT TOP 1 1'或'SELECT 1 .. LIMIT 1'是否有一種普遍接受的方式來執行此操作,而無需知道哪個RDMS? – Seph

+0

不是。儘管如此,OP的代碼看起來像TSQL。 –

1

你可以擺脫所有@CountX變量並執行以下操作:

(SQL EXISTS()有效地檢查至少單列退出,是否立即返回,所以它會快則因爲退出時第一排找到COUNT(*))

SELECT @Zone = CASE WHEN EXISTS (
          SELECT * FROM LS_CLIENT_INSEE_A 
          WHERE NO_INSEE = @TheInsee 
          ) 
       THEN 'A' END 

...