2014-02-05 3 views
5

мне нужно, чтобы отобразить клавиатуры игроков из списка групп, и я был в состоянии, используя следующий SQL:SQL Заменить значения NULL с собственным текстом

SELECT BAND.NAME AS Band_Name, KBPLAYER.NAME AS Keyboard_Player 
FROM BAND 
FULL OUTER JOIN (
    SELECT M.NAME, MO.BID 
    FROM MEMBEROF MO, MEMBER M 
    WHERE MO.INSTRUMENT='keyboards' 
    AND M.MID=MO.MID 
    ) KBPLAYER 
ON BAND.BID=KBPLAYER.BID 
ORDER BY BAND.NAME, KBPLAYER.NAME 

Этот запрос отображает имена всех группа и клавишник (если есть) в этой группе, но я также хочу отображать «No KeyBoard Players» для тех групп, у которых нет клавишника. Как я могу это достичь? Пожалуйста, дайте мне знать, если вы хотите, чтобы я подробно описал структуру таблицы.

Обновление: Обратите внимание, что я не могу использовать ни один из SQL3 procedures (COALESCE, CASE, IF..ELSE). Он должен строго соответствовать стандарту SQL3.

+0

Я только что обновил свои теги. –

+0

Просто проверьте NVL, это может помочь вам – ajitksharma

+0

Это дает вам NULL, если нет клавишника? – Naveen

ответ

1

Я решил сделать это по-другому, так как я не собирался никуда с вышеупомянутым SQL. Я буду признателен, если у кого-то есть предложения сделать для вышеупомянутого SQL с установленными ограничениями.

SELECT 
    band.name AS Band_Name, 'NULL' AS Keyboard_Player 
FROM 
    memberof 
INNER JOIN 
member 
ON 
    memberof.mid = member.mid 
FULL JOIN 
    band 
ON 
    memberof.bid = band.bid 
AND 
    instrument = 'keyboards' 

WHERE 
    member.name IS NULL 

UNION 

SELECT 
    band.name AS Band_Name, member.name AS Keyboard_Player 
FROM 
    memberof 
INNER JOIN 
member 
ON 
    memberof.mid = member.mid 
FULL JOIN 
    band 
ON 
    memberof.bid = band.bid 
WHERE 
    instrument = 'keyboards' 
7

Используйте функцию coalesce. Эта функция возвращает первый из аргументов, которые не равны нулю. Например:

COALESCE(KBPLAYER.NAME,'No KeyBoard Players') AS Keyboard_Player 
+0

Это работает - за исключением требования моего требования, я не могу использовать COALESCE. Есть ли альтернатива, на которую я могу заглянуть? –

+0

Вам разрешено использовать заявление о делах? И, пожалуйста, обновите свой вопрос с помощью любых ограничений, таких как функции, которые вам не разрешено использовать. – harmic

+0

Обновлено. См. Выше. –

0

Согласно вашему комментарию, чтобы заменить пустую строку на какой-либо текст, простым решением является использование оператора case, как показано ниже.

SELECT BAND.NAME AS Band_Name, 
CASE WHEN KBPLAYER.NAME = '' THEN 'No Player' ELSE KBPLAYER.NAME END AS Keyboard_Player 
FROM BAND 
FULL OUTER JOIN (
    SELECT M.NAME, MO.BID 
    FROM MEMBEROF MO, MEMBER M 
    WHERE MO.INSTRUMENT='keyboards' 
    AND M.MID=MO.MID 
    ) KBPLAYER 
ON BAND.BID=KBPLAYER.BID 
ORDER BY BAND.NAME, KBPLAYER.NAME 
+0

Спасибо Naveen - но я только что обновил свой вопрос с определенными ограничениями, как советовал Harmic. –

0

Попробуйте это ....

SELECT BAND.NAME AS Band_Name, 
ISNULL(NULLIF(KBPLAYER.NAME,''),'No KeyBoard Players') AS Keyboard_Player 
    FROM BAND 
    FULL OUTER JOIN (
     SELECT M.NAME, MO.BID 
     FROM MEMBEROF MO, MEMBER M 
     WHERE MO.INSTRUMENT='keyboards' 
     AND M.MID=MO.MID 
     ) KBPLAYER 
    ON BAND.BID=KBPLAYER.BID 
    ORDER BY BAND.NAME, KBPLAYER.NAME 
+0

Я получаю ERROR: функция isnull (текст, неизвестно) не существует ». –

+0

ISNULL проверяет, имеет ли значение столбца значение NULL, но в этом случае имеет пустую строку. Так что null не будет работать. – Naveen

+0

Из-за этого я добавил 'NULLIF' см. Выше запрос – tarzanbappa

-1

Если NVL разрешено, ниже должно работать.

NVL(KBPLAYER.NAME, 'No KeyBoard Players') 
+0

Я получаю «ОШИБКА: функция nvl (характер меняется, неизвестен) не существует». –

+0

Вопрос отмечен postgresql - NVL является нестандартным и не поддерживается postgresql. coalesce является эквивалентом. – harmic

Смежные вопросы