这个查询让我想到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 ''=''
我不想要替代方案,我只想知道为什么 忽略第一个条件并采取第二个条件。
答案 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
值特定值,例如1
或NULL
;
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查询返回所有记录。