如何在sql中将重复值显示为NULL?

How to show the repeated value as NULL in sql?

我有一个查询结果如下,如何用 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'

结果:

要求的结果:所有变灰结果为空

如果您正在使用 Mysql 8,请尝试使用 Rank().. 因为我没有您的 table 或数据无法测试此查询。

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;

首先,这种转换通常最好在应用程序级别完成。原因是它假定结果集是按特定顺序排列的——即使没有 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 子句需要与 window 函数的 ORDER BY 兼容。