Как показать повторное значение как NULL в SQL? - PullRequest
0 голосов
/ 06 апреля 2019

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

Запрос:

SELECT
    word.lemma,
    synset.definition,
    synset.pos,
    sampletable.sample
FROM
    word 
        LEFT JOIN
    sense ON word.wordid = sense.wordid
        LEFT JOIN
    synset ON sense.synsetid = synset.synsetid
        LEFT JOIN
    sampletable ON synset.synsetid = sampletable.synsetid
WHERE
    word.lemma = 'good'

Результат: enter image description here

Требуемый результат: все выделены серым результаты в виде NULL

enter image description here

Ответы [ 2 ]

0 голосов
/ 06 апреля 2019

Во-первых, это тип преобразования, который обычно лучше выполнять на уровне приложения.Причина в том, что это предполагает, что набор результатов находится в определенном порядке - и вы, похоже, предполагаете это даже без предложения order by.

Во-вторых, в приложении это часто проще.

Однако в MySQL 8+ это не так сложно.Вы можете сделать:

SELECT w.lemma,
       (CASE WHEN ROW_NUMBER() OVER (PARTITION BY w.lemma, ss.definition ORDER BY st.sample) = 1
             THEN ss.definition
        END) as definition,
       ss.pos,
       st.sample
FROM word w LEFT JOIN
     sense s
     ON w.wordid = s.wordid LEFT JOIN
     synset ss
     ON s.synsetid = ss.synsetid LEFT JOIN
     sampletable st
     ON ss.synsetid = st.synsetid
WHERE w.lemma = 'good'
ORDER BY w.lemma, ss.definition, st.sample;

Чтобы это работало надежно, внешнее предложение ORDER BY должно быть совместимо с ORDER BY для оконной функции.

0 голосов
/ 06 апреля 2019

Если вы используете Mysql 8, попробуйте использовать Rank () .. Так как у меня нет вашей таблицы или данные не могут проверить этот запрос.

SELECT
    word.lemma
    ,case when r = 1 synset.definition else null end as definition
    ,synset.pos
    ,sampletable.sample
FROM
    (
    SELECT
        word.lemma
        ,synset.definition
        ,synset.pos
        ,sampletable.sample
        ,RANK() OVER (PARTITION BY synset.definition ORDER BY synset.definition) r
    FROM
        (
        SELECT
            word.lemma,
            synset.definition,
            synset.pos,
            sampletable.sample
        FROM
            word 
                LEFT JOIN
            sense ON word.wordid = sense.wordid
                LEFT JOIN
            synset ON sense.synsetid = synset.synsetid
                LEFT JOIN
            sampletable ON synset.synsetid = sampletable.synsetid
        WHERE
            word.lemma = 'good'
        ) t
    )t1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...