Приоритетный выбор записей базы данных - PullRequest
0 голосов
/ 25 февраля 2019

В 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 или "gamma", если code=2.

Это, конечно, легко сделать с помощью двух операторов SQL, но возможно ли это сделать с помощью одногоОператор SQL?

РЕДАКТИРОВАТЬ

Меня попросили уточнить.Поэтому я попробую:

Таблица используется несколькими веб-сайтами.Каждый сайт должен преобразовать код в значение.Для некоторых кодов некоторые сайты могут иметь свои собственные переводы;для других кодов они имеют общий перевод.Когда сайт ищет код в таблице, необходимо вернуть специфичное для сайта значение, если оно существует, в противном случае необходимо вернуть глобальное значение.

Простой способ сделать это:

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

Если этот оператор возвращает значение, используйте его.В противном случае сделайте следующее:

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

К сожалению, программное обеспечение имеет неприятное требование, что оператор SQL должен храниться в файле конфигурации, который может содержать только один оператор SQL.Поэтому мне интересно, можно ли выразить это как один оператор SQL.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете использовать 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).

0 голосов
/ 25 февраля 2019

Вы можете использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...