首页 > 解决方案 > 基于特定表值的 SQL 连接选择

问题描述

目标:选择所有项目,users_allergy =0但过滤掉项目时allergy=1

User_peanut_allergy = 0表示用户没有花生过敏。

User_peanut_allergy = 1表示用户有这种过敏症。不要展示坚果

用户表和营养表中的过敏项设置为 1。如果用户没有过敏,则表值为 0。

如果用户没有过敏但在过敏时失败(设置为1),则此方法有效。它失败了,因为>=0。我需要区分匹配greater than 0但不是users allergy is a 1.

SELECT *
FROM [dbo].[Nutrition]
INNER JOIN Users ON Nutrition.contains_gluten >= Users.gluten_allergy
    AND Nutrition.contains_nuts >= Users.peanut_allergy
    AND Nutrition.contains_fish >= Users.fish_allergy
    AND Nutrition.contains_soy >= Users.soy_allergy
    AND Nutrition.contains_dairy >= Users.dairy_allergy
WHERE Users.username = 'Kyle';

如何放置 if 语句来确定用户是否没有过敏,然后显示所有项目?

IF (Users.peanut_allergy == 0)
    SELECT everything including allergy items
ELSE
    JOIN
    WHERE contains_nuts = 0

示例数据:https0 for no allergy ://pastebin.com/2knYTcHk 使用和 测试用户表1 for allergy

标签: sqlsql-server

解决方案


如果你想要 1/0 组合,你可以使用乘法:

SELECT * 
FROM [dbo].[Nutrition] JOIN
     Users
     ON Nutrition.contains_gluten * (1 - Users.gluten_allergy) = 1 OR
        Nutrition.contains_nuts * (1 - Users.peanut_allergy) = 1 OR
        Nutrition.contains_fish * (1 - Users.fish_allergy) = 1 OR
        Nutrition.contains_soy * (1 - Users.soy_allergy) = 1 OR
        Nutrition.contains_dairy * (1 - Users.dairy_allergy) = 1
WHERE Users.username = 'Kyle';

我也认为这>会奏效。


推荐阅读