优先选择数据库条目

时间:2019-02-25 13:57:49

标签: mysql sql select

在MySQL中,我有一个像这样的表:

+----+------+-------+-------+
| id | code | site  | value |
+----+------+-------+-------+
|  1 |    1 | NULL  | alpha |
|  2 |    2 | NULL  | beta  |
|  3 |    2 | xyzzy | gamma |
+----+------+-------+-------+

该表将valuecode关联。

条目可以包含全局值(由site=NULL表示)或专用值(由site="something"表示)。

我正在尝试构造一条SQL语句,给定site的值,该语句将返回专用值(如果存在),否则将返回全局值。

在上面的示例中,假设我正在使用site="xyzzy"查找值,那么我希望我的SQL语句如果"alpha"返回code=1,或者如果{{1 }}。

当然,使用两个SQL语句很容易,但是使用单个SQL语句可以做到吗?

编辑

已被要求澄清。所以我会尝试:

该表由多个网站使用。每个站点都需要将代码转换为值。对于某些代码,某些网站可能拥有自己的翻译;对于其他代码,它们共享全局翻译。当站点在表中查找代码时,必须返回特定于站点的值(如果存在),否则必须返回全局值。

执行此操作的简单方法是:

"gamma"

如果此语句返回一个值,请使用它。否则,请执行以下操作:

code=2

不幸的是,该软件对SQL语句必须存储在只能包含一个 SQL语句的配置文件中有不愉快的要求。因此,我想知道是否可以将其表达为单个SQL语句。

2 个答案:

答案 0 :(得分:2)

您可以使用ORDER BYLIMIT

SELECT value
FROM xx
WHERE code = 2 AND
      (site = 'xyzzy' OR site IS NULL)
ORDER BY (site IS NOT NULL) DESC
LIMIT 1;

ORDER BY首先将网站的非NULL值放入,然后是NULL值。

答案 1 :(得分:2)

您可以使用LEFT JOIN和COALESCE():

select coalesce(s.value, g.value)
from xx g      -- global
left join xx s -- specialized
  on  s.code = g.code
  and s.site = 'xyzzy'
where g.code = 2
  and g.site is null

此方法的优点是您可以扩展它,以使用where g.code in (1, 2, 5)一次获取多个值。