Как заменить NULL целочисленным значением в DB2? - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь заменить NULL целочисленным значением 1 (или 0, если это сделано во вложенном sql-statment) в столбце «Antal tillgängliga språk».Некоторые строки получают правильное значение, но некоторые получают NULL.Я предполагаю, что это потому, что мой вложенный SQL-оператор возвращает только то, что соответствует моему предложению where.Есть некоторые bokid ведьмы, которые не имеют Språk из xpath-выражения.

  • Я пробовал использовать SELECT COALESCE (COUNT (Språk) +1, 1) AS "Antal tillgängliga språk", ноэто не сработало.
  • Я также пробовал SELECT IFNULL (COUNT (Språk) +1, 1) AS "Antal tillgängliga språk", но это тоже не сработало.
  • У меня также естьпопытался изменить выражение where во вложенном sql-statment для использования FULL JOIN, ведьма также не сработала.

Теперь у меня нет идей, может кто-нибудь мне помочь?

SELECT DISTINCT Title AS "Titel", 
    OriginalLanguage AS "Orginalspråk", 
    Genre AS "Genre", 
    (SELECT COUNT(Id)
    FROM Edition
    WHERE Edition.Book = Book.Id) AS "Antal upplagor",
    (SELECT COUNT(Språk)+1 AS "Antal tillgängliga språk"
    FROM (SELECT Book.Id AS bokid, Språk
        FROM Edition, XMLTABLE('$TRANSLATIONS//Translation/@Language' 
            COLUMNS Språk VARCHAR(20) PATH '.'), Book
        WHERE Edition.Book = Book.Id
        GROUP BY Språk, Book.Id)
    WHERE bokid = Book.Id
    GROUP BY bokid),
    (SELECT COUNT(Author)
    FROM Authorship
    WHERE Authorship.Book = Book.Id) AS "Antal författare",
    (SELECT MIN(Year)
    FROM Edition
    WHERE Edition.Book = Book.Id) AS "År första upplaga"
FROM Book

+1 - считать все доступные языки книг, все переводы + язык оригинала.

Ответы [ 3 ]

0 голосов
/ 18 мая 2018

Запрос также может быть написан так.В какой-то степени это стиль, который вы предпочитаете делать, но в целом коррелированные подвыборы нелегко отладить и, как правило, не так понятны, как объединение отдельных отборов вместе.

SELECT B.Title                    AS "Titel"
,      B.OriginalLanguage         AS "Orginalspråk"
,      B.Genre                    AS "Genre"
,      COALESCE(E.Editions + 1,1) AS "Antal upplagor"
,      COALESCE(S.Språk    + 1,1) AS "Antal tillgängliga språk"
,      COALESCE(A.Authors  + 1,1) AS "Antal författare"
,      COALESCE(E.Min_Year + 1,1) AS "År första upplaga"
FROM Book B
LEFT OUTER JOIN
(   SELECT  Book
    ,       COUNT(*)        AS Editions
    ,       MIN(Year)       AS Min_Year
    FROM Edition
    GROUP BY
            Book
) E
ON
    E.Book = B
LEFT OUTER JOIN
(   SELECT Book
    ,      COUNT(Author)   AS Authors
    FROM Authorship
    GROUP BY
            Book
) A
ON
    A.Book = B.Id
LEFT OUTER JOIN      
(   SELECT  Book
    ,       COUNT(DISTINCT Språk)   AS Språk
    FROM Edition
    ,    XMLTABLE('$TRANSLATIONS//Translation/@Language'  COLUMNS Språk VARCHAR(20) PATH '.')
    GROUP BY
            Book
) S
ON
    S.Book = B.Id
;
0 голосов
/ 18 мая 2018

Лично я бы реорганизовал запрос к чему-то вроде (НЕПРОВЕРЕНО)

Я бы предпочел получить данные один раз для всех записей в памяти, а не выполнять запрос для каждой строки.Разница в производительности не будет иметь большого значения до тех пор, пока размеры таблицы не увеличатся;хотя генерация Språk может привести к тому, что это замечание в деградации производительности будет реализовано раньше, чем позже.

SELECT DISTINCT Title AS "Titel", 
    OriginalLanguage AS "Orginalspråk", 
    Genre AS "Genre", 
    "Antal upplagor",
    coalesce("Antal tillgängliga språk",0) AS "Antal tillgängliga språk",
    coalesce("Antal författare", 0) AS "Antal författare",
    coalesce("År första upplaga",0) AS "År första upplaga"
FROM Book
LEFT JOIN (SELECT COUNT(Språk)+1 AS "Antal tillgängliga språk", bokid
           FROM (SELECT Book.Id AS bokid, Språk
                 FROM Edition
                    , XMLTABLE('$TRANSLATIONS//Translation/@Language' COLUMNS Språk VARCHAR(20) PATH '.')
                 INNER JOIN Book
                    ON Edition.Book = Book.Id
                 GROUP BY Språk, Book.Id)
           GROUP BY bokid)  BE
  ON BE.bokid = Book.Id
LEFT JOIN  (SELECT Book, COUNT(Author) AS "Antal författare"
            FROM Authorship
            GROUP BY Book)  A
  ON A.Book = Book.Id
LEFT JOIN  (SELECT Book, MIN(Year) AS "År första upplaga", Count(ID) AS "Antal upplagor"
            FROM Edition
            GROUP BY Book) E
  ON E.Book = Book.Id
0 голосов
/ 18 мая 2018

Поместите свой COALESCE за пределы вашего суб-выбора

SELECT DISTINCT Title AS "Titel", 
    OriginalLanguage AS "Orginalspråk", 
    Genre AS "Genre", 
    COALESCE((SELECT COUNT(Id)
    FROM Edition
    WHERE Edition.Book = Book.Id),1) AS "Antal upplagor",
    COALESCE((SELECT COUNT(Språk)+1 AS "Antal tillgängliga språk"
    FROM (SELECT Book.Id AS bokid, Språk
        FROM Edition, XMLTABLE('$TRANSLATIONS//Translation/@Language' 
            COLUMNS Språk VARCHAR(20) PATH '.'), Book
        WHERE Edition.Book = Book.Id
        GROUP BY Språk, Book.Id)
    WHERE bokid = Book.Id
    GROUP BY bokid),1),
    COALESCE((SELECT COUNT(Author)
    FROM Authorship
    WHERE Authorship.Book = Book.Id),1) AS "Antal författare",
    COALESCE((SELECT MIN(Year)
    FROM Edition
    WHERE Edition.Book = Book.Id),1) AS "År första upplaga"
FROM Book
...