如果属性存在,则在WHERE子句中使用它

rslzwgfq  于 2022-10-01  发布在  其他
关注(0)|答案(3)|浏览(146)

假设您有以下查询:

OPTIONAL MATCH (a:A)-[aff:AFFECTS]->(prd:Product { name:"name1" })
WHERE aff.versionStart <= "10.1.1" <= aff.versionEnd 
RETURN a

这可以很好地工作,但我的问题是我并不总是拥有versionEnd属性,所以在这些情况下,我只想检查aff.versionStart <= "10.1.1",同时如果它存在,则检查aff.versionStart <= "10.1.1" <= aff.versionEnd。有什么方法可以做到这一点吗?

因为我知道我可以使用IS NOT NULL来检查它是否存在,但我还没有想好如何说“如果它不是空的,那么使用它,否则跳过它

lb3vh1jj

lb3vh1jj1#

您可以使用COALESCE()并提供一个您确信WHERE子句的第二部分返回TRUE的值

OPTIONAL MATCH (a:A)-[aff:AFFECTS]->(prd:Product { name:"name1" })
WHERE  aff.versionStart <= "10.1.1" <= COALESCE(aff.versionEnd, '99.9.9') 

RETURN a
jhiyze9q

jhiyze9q2#

Coalesce()更易于编写和理解。如果您想要一个Case When Else语句,那么它就是

OPTIONAL MATCH (a:A)-[aff:AFFECTS]->(prd:Product { name:"name1" })
WHERE  
    aff.versionStart 
     <= 
       "10.1.1" 
     <= 
     (case when aff.versionEnd is NOT NULL 
      then aff.versionEnd else '99' end)
RETURN a
d6kp6zgx

d6kp6zgx3#

这就是这样做的方式,如果它只存在,那么它将被使用,否则将被忽略:

OPTIONAL MATCH (a:A)-[aff:AFFECTS]->(prd:Product { name:"name1" })
WHERE (aff.versionStart <= "10.1.1") AND (aff.versionEnd IS NULL OR "10.1.1" <= aff.versionEnd) 
RETURN a

相关问题