OR运算符如何在SQL中运行?

时间:2015-10-12 08:32:47

标签: mysql sql

这个查询让我想到SQL中的OR运算符是如何工作的。

SELECT * FROM crop WHERE  `crop_id`=1 OR  ''='' ;

我认为out out将包含crop_id等于1的记录,因为我有记录具有该值,并且逻辑上它不评估第二个条件。

但它返回所有记录,而不是返回过滤(使用crop_id)值。

我错了吗?

更新

我有条件,如果crop_id = 1匹配,它应该返回所有具有crop_id = 1的值,否则返回所有记录。

Upadte 2

上面提到的查询 条件都是真的,即crop_id=1 and ''=''我不想要替代方案,我只想知道为什么 忽略第一个条件并采取第二个条件。

5 个答案:

答案 0 :(得分:3)

OR

它在任何boolean语句中都有效。

  

我认为out out将包含crop_id等于1的记录,因为我有记录具有该值,并且逻辑上它不评估第二个条件。

你是对的,但是如果你没有值equal to 1那么它会评估第二部分并返回true因此你总是得到结果,无论你是否匹配你OR的第一部分。

答案 1 :(得分:3)

OR运算符的布尔逻辑如下:

true OR true = true
false OR true = true
true OR false = true
false OR false = false

因此,在您的SQL查询中,您将'' = ''置于此布尔逻辑的计算结果为true,因此您也将得到所有结果。如果您只想使用crop_id = 1获得结果,请使用以下查询:

SELECT * FROM crop WHERE  `crop_id`=1

无需使用OR

答案 2 :(得分:1)

用于您想要的输出或不会被使用,而不是使用其他。即。

你必须

 select count (*) from crop where 'crop_id'=1 
if count>0
{
select * from crop where 'crop_id'=1
}else
{
select * from crop;

}

因为或者像它一样工作会给出所有结果等于1和所有空结果。 作为或意味着任何一个条件应该是真的。 所以无论是1,它都会来。 如果它是空的而不是它会来 所有人都会来。 所以你必须使用if else。 请为google做正确的if else语法。但逻辑只会是这些。

感谢

答案 3 :(得分:1)

对于您的原始问题,答案是:

WHERE something OR TRUE -- always TRUE

所以你将永远得到所有记录。

对于第二个问题,它看起来像你想要

您传递@param值特定值,例如1NULL;

SELECT * 
FROM crop 
WHERE crop_id = @param OR @param IS NULL;

SELECT * 
FROM crop 
WHERE crop_id = COALESCE(@param, crop_id);

您也可以使用IF ELSE,例如:

IF @param IS NULL THEN
   SELECT * 
   FROM crop
ELSE
   SELECT * 
   FROM crop 
   WHERE crop_id = @param 
END IF

修改

  

人们说你不需要知道Math是程序员。

当需要Math(布尔逻辑)时就是这种情况。

╔═════════════╦═════════════╦═══════╗
║ Statement_1 ║ Statement_2 ║  AND  ║
╠═════════════╬═════════════╬═══════╣
║ TRUE        ║ TRUE        ║ TRUE  ║
║ FALSE       ║ TRUE        ║ FALSE ║
║ TRUE        ║ FALSE       ║ FALSE ║
║ FALSE       ║ FALSE       ║ FALSE ║
╚═════════════╩═════════════╩═══════╝

╔═════════════╦═════════════╦═══════╗
║ Statement_1 ║ Statement_2 ║  OR   ║
╠═════════════╬═════════════╬═══════╣
║ TRUE        ║ TRUE        ║ TRUE  ║
║ FALSE       ║ TRUE        ║ TRUE  ║
║ TRUE        ║ FALSE       ║ TRUE  ║
║ FALSE       ║ FALSE       ║ FALSE ║
╚═════════════╩═════════════╩═══════╝

现在Statement_2'' = '',始终为 TRUE

╔═════════════╦═════════════╦══════╗
║ Statement_1 ║ Statement_2 ║  OR  ║
╠═════════════╬═════════════╬══════╣
║ TRUE        ║ TRUE        ║ TRUE ║
║ FALSE       ║ TRUE        ║ TRUE ║
╚═════════════╩═════════════╩══════╝

如您所见,结果始终为 TRUE 。而且无需评估Statement_1

condition OR TRUE <=> TRUE     (THIS IS TAUTOLOGY!!!)
  

重言式是一种在每种可能的解释中都是正确的公式

最后你的情况相当于:

WHERE 1=1 -- will return all records

答案 4 :(得分:0)

OR运算符检查是否有任何表达式为真,然后它将返回true。

在你的情况下     ''= '' 始终为true,因此SELECT查询返回所有记录。