带有OR语句的SELECT

问题描述 投票:0回答:2

我想获取以下数据:如果:Code不为NULL,我想与所有4个条件匹配:代码,接触器,类型和命名法。如果:Code为NULL,我只想匹配Contractor,Type和Nomenclature。我在这里写了一些查询

SELECT "Nomenclature" as "IdNom",
       "Cod"          as "ContrCode",
       "Contanctor"
FROM "КодНоменклатуры"

WHERE (:Code IS NOT NULL OR "Code" = ANY (:Code :: text[]))

  AND ("Contactor" = :Contractor::integer
  AND "Type" = :IsSupplier::integer
  AND "Nomenclature" IS NOT NULL)

但是它无法正常工作。当我输入代码时,它将查询与承包商,类型和术语匹配但与代码不匹配的所有内容。如果我没有输入代码,则结果是正确的,我匹配了Contractor,Type和Nomenclature。

sql postgresql postgresql-9.5
2个回答
0
投票
SELECT "Nomenclature" AS "IdNom", "Cod" AS "ContrCode", "Contanctor"
FROM "КодНоменклатуры"
WHERE (
        :Code IS NOT NULL AND "Contactor" = :Contractor::integer AND "Type" = IsSupplier::integer AND "Nomenclature" IS NOT NULL
      ) 
      OR 
      (
        "Code" = ANY (:Code :: text[]) AND "Contactor" = :Contractor::integer
      )

0
投票

...WHERE :Code IS NOT NULL...将始终为TRUE,只要您将内容传递给:Code。因此,OR之后的部分将不再进行评估,因为那时整个术语为TRUE。

© www.soinside.com 2019 - 2024. All rights reserved.