2011-10-19 79 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 

...