MySQL выбирает логические поля и создает третье состояние - PullRequest
0 голосов
/ 11 июля 2019

Я использую MySQL и хочу получить логическое значение с 3 состояниями (-1,0,1) для существующих полей.

Например, если у меня есть col1 = null or row doesn't exist col2 = 0 col3 = 1

Тогда я делаю:

SELECT col1, col2, col3 FROM customers

Я хочу получить это:

Output
col1 = -1
col2 = 0
col3 = 1

Как это возможно?

примечание: в моем коде я буду использовать LEFT JOIN в своем запросе, поэтому, когда строка не существует, думаю, я получу ноль.

1 Ответ

1 голос
/ 11 июля 2019

Примерно так:

SELECT
  a.a,
  COALESCE(b.b, -1) as b
FROM
  a LEFT JOIN B ON a.id = b.aid

Предположим, у нас есть таблицы:

A.id, A.a
1, 'hello'
2, 'goodbye'
3, 'what'

B.aid, b.b
1, 1
2, null

Когда мы соединяем их с левым соединением, мы получим:

A.id, a.a,       B.aid, b.b
1,    'hello',   1,     1
2,    'goodbye', 2,     null     --b.b is null because the row value is null
3,    'what',    null,  null     --b.b is null because there is no row, all b columns are null

COALESCE просматривает аргументы слева направо в порядке, возвращая первый ненулевой.Если строка в b не существует или существует, но bb в таблице равно NULL, COALESCE превратит ее в -1:

A.id, a.a,       B.aid, b.b
1,    'hello',   1,     1
2,    'goodbye', 2,     -1       --b.b is -1 because COALESCE found -1 as the first non null value
3,    'what',    null,  -1       --b.b is -1 because COALESCE found -1 as the first non null value

Если вы хотите использовать 0, если bbnull, но -1, если bb не существует, вам нужно CASE WHEN, используя что-то со значением:

SELECT
  a.a,
  CASE WHEN b.aid IS NULL THEN -1 ELSE COALESCE(b.b, 0) END as b 
FROM
  a LEFT JOIN B ON a.id = b.aid

Здесь мы проверяем один из столбцов, используемых в соединении, b.aid.Если это значение равно нулю, мы знаем, что соединение не удалось, и в B нет строки для этой строки в A, поэтому мы можем CASE WHEN проверить b.aid на наличие нуля, и если это так, то положить -1 в качестве нашего "-1 означаетни одна строка не была в b ", иначе мы можем COALESCE, чтобы превратить bb в 0, если оно равно нулю.Это дает результат как:

A.id, a.a,    B.aid, b.b
1, 'hello',   1,     1
2, 'goodbye', 2,     0        --b.b is 0 because CASE WHEN's ELSE block was used, and COALESCE found 0 as the first non null value
3, 'what',    null, -1       --b.b is -1 because CASE WHEN's WHEN block fired, because b.aid was null, and CASE WHEN provided -1 as the value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...