SQL在多个表上选择EXIST作为布尔值(位)

时间:2014-05-26 13:39:46

标签: sql sql-server casting exists

我正在使用this question中接受的答案,但是对于多个表格。

$result = mssql_query("SELECT CAST(
       CASE WHEN 
         EXISTS(select 1 from codes where code = '".$generatedCode."') OR 
         EXISTS(select 1 from pakete where code = '".$generatedCode."') OR
         EXISTS(select 1 from kunden where code = '".$generatedCode."') OR
         EXISTS(select 1 from formulare where code = '".$generatedCode."') OR  
         EXISTS(select 1 from berater where code = '".$generatedCode."') 
       THEN 1 
       ELSE 0 
       END 
    AS BIT) as 'exists'";

$row = mssql_fetch_assoc($result);
if ($row['exists']==0)

理论上它看起来不错,实际上它也有效。但它有时会发生,即使其中一个表中存在“代码”,查询(我认为)也会出错并返回1。

也许有人知道一个更好的解决方案来检查表,在那里可能会发生搜索到的varchar仅存在于一个或两个表中。

fyi:generatedcode是一个九位数的字母数字唯一字符串。

此致 马库斯

UPDATE:查询按预期工作,返回后失败是一个错误的命名变量,因此使用了原始生成的代码(重复的代码)。感谢您的帮助和简化查询。

2 个答案:

答案 0 :(得分:0)

你知道,你可以使用简单的union和num_rows,没有必要选择一点 - 除非你的查询是其他复杂查询的一部分,否则它不会有任何好处:

$sql="select 1 from codes where code = '".$generatedCode."' 
union select 1 from pakete where code = '".$generatedCode."'
union select 1 from kunden where code = '".$generatedCode."'
union select 1 from formulare where code = '".$generatedCode."'
union select 1 from berater where code = '".$generatedCode."'";
$result = mssql_query($sql);
if(mssql_num_rows($result)){}

答案 1 :(得分:0)

我猜你的代码有效。你可以做几件事来改进它。首先,cast()不是必需的,因为您可以直接输入位文字(请参阅here)。以下代码使用两种方法表达bit文字。

其次,不要使用单引号作为列名(当然,不推荐使用mysql_,但这是另一回事,因为这只关注查询)。实际上,您应该避免使用保留字作为列名。所以:

SELECT (CASE WHEN 
         EXISTS(select 1 from codes where code = '".$generatedCode."') OR 
         EXISTS(select 1 from pakete where code = '".$generatedCode."') OR
         EXISTS(select 1 from kunden where code = '".$generatedCode."') OR
         EXISTS(select 1 from formulare where code = '".$generatedCode."') OR  
         EXISTS(select 1 from berater where code = '".$generatedCode."') 
         THEN 0b1 
         ELSE  b'0' 
       END) as CodeExists

顺便说一句,我会阻止你使用比特,除非你真的知道你在优化方面做了什么。它们可能无法节省空间,并且可能无法更快地运行。以下对我来说似乎完全合情合理:

SELECT (EXISTS(select 1 from codes where code = '".$generatedCode."') OR 
        EXISTS(select 1 from pakete where code = '".$generatedCode."') OR
        EXISTS(select 1 from kunden where code = '".$generatedCode."') OR
        EXISTS(select 1 from formulare where code = '".$generatedCode."') OR  
        EXISTS(select 1 from berater where code = '".$generatedCode."') 
       ) as CodeExists