如何查询多个“不等于”条件

时间:2019-04-03 09:01:51

标签: sql sql-server where-clause

我正在尝试找出如何拉回“字段A”和“字段B”不能为集合组合的记录。

示例:字段A不能等于“预定”,而字段B等于“预定”

但是我确实想查看其他记录,其中字段A =“计划的”和字段B =“预计划的”

我希望这是有道理的,请参见下面的脚本,我包括一个非常基本的临时表,其中包含要尝试实现的示例,使用CONCAT可以解决此问题,但我认为这不是最好的解决方案?

我知道我可以通过执行不存在的操作来排除这些错误,但是在实际数据库中,这将是一个大表,并且我不希望对此进行重复查询。

我也有解决方法,但我想知道是否有适当/更好的方法来完成此任务。

请查看代码和注释。

class SubSubjectListSerializer(serializers.ModelSerializer):
    topics = serializers.SerializerMethodField()
    sub_subject_id = serializers.CharField(source='id')

    class Meta:
      model = Subsubject
        fields = [
        'sub_subject_id',
        'title',
        'slug',
        'topics'
        ]

    def get_topics(self, obj):
       qs = obj.topics.all().order_by('id')
       return TopicListSerializer(qs, many=True, read_only=True).data


  class SubjectDetailSerializer(serializers.ModelSerializer):
     sub_subjects = serializers.SerializerMethodField()

    class Meta:
      model = Subject
      fields = [
        'id',
        'title',
        'short_name',
        'icon_file',
        'contents',
        'slug',
        'image',
        'is_block',
        'status',
        'created_on',
        'created_by',
        'updated_on',
        'updated_by',
        'meta_description',
        'meta_keywords',
        'head_script',
        'sub_subjects',

    ]

  def get_sub_subjects(self, obj):
    return SubSubjectListSerializer(obj.sub_subjects.exclude(title='Others') 
                                         many=True).data

-我希望这会返回(C)点的结果,但要记住(D)。

3 个答案:

答案 0 :(得分:2)

您可以尝试使用OR代替AND

SELECT * 
FROM [#Temp]
WHERE  ([status] <> 'Scheduled' or [fkStatus] <> 'PreliminaryScheduled')

答案 1 :(得分:1)

使用NOT取消您不希望满足的条件:

SELECT * FROM #temp 
WHERE NOT ([status] = 'Scheduled'  AND [fkStatus] = 'PreliminaryScheduled')

或者,使用OR

SELECT * FROM #temp 
WHERE [status] <> 'Scheduled'  OR [fkStatus] <> 'PreliminaryScheduled'

它们都产生相同的查询计划(使用OR),您可能会发现第一个查询更清晰。

答案 2 :(得分:1)

您可以使用NOT语句。

SELECT * FROM [#Temp]
    WHERE [Date] < '2019-01-01'
        AND NOT ([status] = 'Scheduled'  AND [fkStatus] = 'PreliminaryScheduled')