Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如果找不到行,则联接条件中的回退值_Mysql_Mariadb - Fatal编程技术网

Mysql 如果找不到行,则联接条件中的回退值

Mysql 如果找不到行,则联接条件中的回退值,mysql,mariadb,Mysql,Mariadb,前言:恐怕我是在要求做一些无法实现的事情。但我知道,如果有办法做到这一点,这里会有人知道:) 假设我有一个MySQL数据库(或者一个MariaDB数据库,如果可以保持兼容性的话)。我需要从表a中进行选择,并根据具有特定值X的特定列连接表B;表B中可能不存在合适的行,这意味着我将使用左外连接。但是,如果找不到任何行(TableB的任何行在该列中都没有值X),那么我希望使用TableB中值为Y的行。换句话说,Y应该作为联接的回退条件 这是我的具体例子。假设我通过在两个表之间拆分一个实体(例如,一个产

前言:恐怕我是在要求做一些无法实现的事情。但我知道,如果有办法做到这一点,这里会有人知道:)

假设我有一个MySQL数据库(或者一个MariaDB数据库,如果可以保持兼容性的话)。我需要从表a中进行选择,并根据具有特定值X的特定列连接表B;表B中可能不存在合适的行,这意味着我将使用左外连接。但是,如果找不到任何行(TableB的任何行在该列中都没有值X),那么我希望使用TableB中值为Y的行。换句话说,Y应该作为联接的回退条件

这是我的具体例子。假设我通过在两个表之间拆分一个实体(例如,一个产品)来处理数据本地化,一个表具有可本地化数据,另一个表具有固定数据。当我想用法语获取产品信息时,如果没有法语信息,我希望回到英语。然而,如果我这样做

// basic stub of the query for demonstration purposes
SELECT * FROM Products p
LEFT OUTER JOIN ProductsLocalization pLoc
      ON pLoc.ProductID = p.ID AND pLoc.Culture = 'fr-FR'
当没有法语信息可用时,我将获得空值。相反,我只希望得到这些行的查询结果

// basic stub of the query for demonstration purposes
SELECT * FROM Products p
LEFT OUTER JOIN ProductsLocalization pLoc
      ON pLoc.ProductID = p.ID AND pLoc.Culture = 'en-US'
当然,后一种质疑是不可接受的

我知道我可以使用OR来基于区域性“fr fr”或“en US”进行连接,但这可能会使所选行数翻倍,并且需要我对结果数据集进行后期处理。我想知道是否有办法避免这种后处理


非重复免责声明:我的问题与其他许多问题类似,但有一个关键的区别。我需要为连接条件本身使用回退值,而不是作为查询的结果。我的默认值不会出现在数据集中,但数据集是基于该默认值计算的

您可以加入两次并使用COALESCE()获得所需的值:

SELECT p.product_desc, 
    COALESCE(pLoc_fr.value, pLoc_en.value) 
FROM Products p
    LEFT OUTER JOIN ProductsLocalization pLoc_us ON 
       pLoc_us.ProductID = p.ID 
       AND pLoc_us.Culture = 'en-US'
    LEFT OUTER JOIN ProductsLocalization pLoc_fr ON 
       pLoc_fr.ProductID = p.ID 
       AND pLoc_fr.Culture = 'fr-FR';

另外,如果您可以想象一种组合数据集的方法,那么您可能可以使用普通的OLSQL来实现。有些边缘情况需要动态生成SQL语句,但这些情况并不常见。在这种情况下,还可以在COALESCE中使用两个相关子查询,或者在SELECT中使用case或IF语句。几乎总是有几种方法可以剥猫的皮。

MySQL和MariaDB之间的差异非常小,因此这里对您的查询没有影响。我经常忘记COALESCE()的功能。谢谢你的回答:它是有效的,我将它标记为正确的。