我正在使用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:查询按预期工作,返回后失败是一个错误的命名变量,因此使用了原始生成的代码(重复的代码)。感谢您的帮助和简化查询。
答案 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