代码之家  ›  专栏  ›  技术社区  ›  oz1cz

优先选择数据库条目

  •  0
  • oz1cz  · 技术社区  · 6 年前

    在MySQL中,我有一个如下所示的表:

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

    value 用一个 code .

    条目可以包含全局值(由 site=NULL site="something" ).

    site ,将返回专用值(如果存在),否则返回全局值。

    在上面的例子中,假设我正在寻找 site="xyzzy" ,我希望我的SQL语句返回 "alpha" 如果 code=1 "gamma" 如果 code=2

    编辑

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

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

    最简单的方法是:

    SELECT value FROM xx WHERE code=2 AND site="xyzzy";
    

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

    SELECT value FROM xx WHERE code=2 and site IS NULL;
    

    SQL语句。所以我想知道是否有可能将其表示为一条SQL语句。

    0 回复  |  直到 6 年前
        1
  •  2
  •   Gordon Linoff    6 年前

    你可以用 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;
    

    这个 订货人 NULL 首先是站点的值,然后是 无效的 价值观。

        2
  •  2
  •   Paul Spiegel    6 年前

    可以使用左连接并合并():

    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) .