Mysql sql查询字符串中的可选变量
我正在自动化excel,我有一个字符串,我从工作表中读取作为变量1,2,3,4,5,6的输入 我希望使它们成为可选的,如果它们保持为空,查询将照常执行Mysql sql查询字符串中的可选变量,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,我正在自动化excel,我有一个字符串,我从工作表中读取作为变量1,2,3,4,5,6的输入 我希望使它们成为可选的,如果它们保持为空,查询将照常执行 SELECT LEFT(Name, 5) FROM Production.Product where product.name like 'Variable1' product.brand like 'Variable2' prodcut.price > 'Variable3' prodcut.expiryd
SELECT LEFT(Name, 5)
FROM Production.Product
where
product.name like 'Variable1'
product.brand like 'Variable2'
prodcut.price > 'Variable3'
prodcut.expirydate > 'Variable4'
ORDER BY ProductID;
试着这样做:
SELECT LEFT(Name, 5)
FROM Production.Product
WHERE
(Product.name like @Variable1 or @Variable1 IS NULL) AND
(Product.brand like @Variable2 or @Variable2 IS NULL) AND
(Product.price > @Variable3 or @Variable3 IS NULL) AND
(Product.expirydate > @Variable4 or @Variable4 IS NULL)
ORDER BY ProductID;
下面的查询应该可以做到这一点:
SELECT LEFT(Name, 5)
FROM Production.Product
WHERE
('Variable1' = '' OR product.name LIKE 'Variable1') AND
('Variable2' = '' OR product.brand LIKE 'Variable2') AND
('Variable3' = '' OR prodcut.price > 'Variable3') AND
('Variable4' = '' OR prodcut.expirydate > 'Variable4')
ORDER BY ProductID;
但是,您的查询看起来不健康。一个可能在MySQL和MSSQL上运行的示例如下所示:
SELECT LEFT(Name, 5)
FROM Production.Product
WHERE
(@Variable1 = '' OR product.name LIKE @Variable1) AND
(@Variable2 = '' OR product.brand LIKE @Variable2) AND
(@Variable3 = '' OR prodcut.price > @Variable3) AND
(@Variable4 = '' OR @Variable4 IS NULL OR prodcut.expirydate > @Variable4)
ORDER BY ProductID;
不过,您首先必须确定变量的数据类型,这可能仍然会更改查询,并且还必须将“*”和/或“%”通配符添加到要抛出的字符串中,否则它没有多大意义,“=”将更快
希望这有帮助
干杯一句话。在这种情况下,操作顺序很重要。写入(像Variable1一样的Product.name或Variable1为NULL)不等于(像Variable1一样的Variable1或像Variable1一样的Product.name),因为第一部分求值的时刻总是返回true,第二个不再进行评估,如果DB足够大,那么这是一个高成本/缓慢的操作,因此它不应该是第一个进行评估的SKORPIOH;根据我的经验,我使用的不是SQL Server,它的工作原理可能与MySQL或Oracle稍有不同。谢谢你的提示,你说得对。我刚刚签入了MSSQL,它比我想象的要聪明,而且无论哪种方式都正确:)如果
@变量
为NULL
<代码>空“”毕竟。您部分正确-@变量可能是空的,也可能不是空的。在这种情况下,这些变量来自excel,因此很可能不会为null。我还提到where子句可能会根据类型声明进行更改,因此,如果变量声明为NOTNULL,那么说“”就足够了;否则它需要空检查和空检查。