在MySQL中,我有一个像这样的表:
+----+------+-------+-------+
| id | code | site | value |
+----+------+-------+-------+
| 1 | 1 | NULL | alpha |
| 2 | 2 | NULL | beta |
| 3 | 2 | xyzzy | gamma |
+----+------+-------+-------+
该表将value
与code
关联。
条目可以包含全局值(由site=NULL
表示)或专用值(由site="something"
表示)。
我正在尝试构造一条SQL语句,给定site
的值,该语句将返回专用值(如果存在),否则将返回全局值。
在上面的示例中,假设我正在使用site="xyzzy"
查找值,那么我希望我的SQL语句如果"alpha"
返回code=1
,或者如果{{1 }}。
当然,使用两个SQL语句很容易,但是使用单个SQL语句可以做到吗?
编辑
已被要求澄清。所以我会尝试:
该表由多个网站使用。每个站点都需要将代码转换为值。对于某些代码,某些网站可能拥有自己的翻译;对于其他代码,它们共享全局翻译。当站点在表中查找代码时,必须返回特定于站点的值(如果存在),否则必须返回全局值。
执行此操作的简单方法是:
"gamma"
如果此语句返回一个值,请使用它。否则,请执行以下操作:
code=2
不幸的是,该软件对SQL语句必须存储在只能包含一个 SQL语句的配置文件中有不愉快的要求。因此,我想知道是否可以将其表达为单个SQL语句。
答案 0 :(得分:2)
您可以使用ORDER BY
和LIMIT
:
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)
一次获取多个值。