Mysql sql查询字符串中的可选变量

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

我正在自动化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.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,那么说“”就足够了;否则它需要空检查和空检查。