SQL-多选过滤器:组合过滤条件以获得正确的结果

时间:2018-07-06 13:30:57

标签: sql sql-server

我正在研究一个过滤器,用户可以为最终输出选择不同的条件。现在,我正在构建SQL查询,但是每当选择更多条件时,它就不会起作用。

广告值表的示例。

+----+-----------+---------------+------------+
| id | listingId | value         | identifier |
+----+-----------+---------------+------------+
| 1  | 1a        | Alaskan Husky | race       |
+----+-----------+---------------+------------+
| 2  | 1a        | Højt          | activity   |
+----+-----------+---------------+------------+
| 3  | 1c        | Akita         | race       |
+----+-----------+---------------+------------+
| 4  | 1c        | Mellem        | activity   |
+----+-----------+---------------+------------+

如您所见,每个advalue都有不同的行。

我期望的结果

比方说,用户选中/选中了“阿拉斯加雪橇犬”竞​​赛的复选框,然后应返回比赛的 listingId (一次)。如果用户将“阿拉斯加雪橇犬”和活动级别都选择为“低”,则它应不返回任何内容,如果活动级别为“梅勒姆”或“霍伊特”(中,高),则应在以下位置返回listingId该种族仅是“阿拉斯加雪橇犬”,而不是“秋田”。希望您了解我要完成的工作。

我尝试过类似的操作,但不会返回任何内容。

SELECT * FROM advalues WHERE (identifier="activity" AND value IN("Mellem","Højt")) AND (identifier="race" AND value IN("Alaskan Husky"))

顺便说一句,我也想选择不同的listingId,所以它只返回唯一的listingId。

我将继续寻找解决方案,这是我在过去几个小时中一直在做的,但是也想在这里发布,因为我还没有找到任何可以帮助我的东西。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以将 identifier 上的限制分为两种类型。然后,您加入listingid以获得具有两种类型的标识符的listingId。

public partial class MainWindow : Window
    {
        HttpClient client = new HttpClient();

        public MainWindow()
        {
            InitializeComponent();

            client.BaseAddress = new Uri("http://localhost:80");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            this.Loaded += MainWindow_Loaded;

            getStatusContent();
            getCategorias();
        }

        async void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            try
            {
                HttpResponseMessage response = await client.GetAsync("/bdevApi/api/index/keyacessoUbasd42123/CategoriaExame");
                response.EnsureSuccessStatusCode(); // Lança um código de erro
                var getData = await response.Content.ReadAsAsync<IEnumerable<Categoria>>();
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro : " + ex.Message);
            }
        }
}

答案 1 :(得分:0)

这个问题尚不清楚,但是我想你想要这个:

WHERE (identifier="activity" AND value IN("Mellem","Højt")) OR (identifier="race" AND value IN("Alaskan Husky"))

答案 2 :(得分:0)

如果我答对了,您正在尝试使用其他“过滤器”获取数据。

您的查询

SELECT listingId FROM advalues 
    WHERE identifier="activity" 
    AND value IN("Mellem","Højt") 
    AND identifier="race" 
    AND value IN("Alaskan Husky")

在您要求identifier = "activity" AND identifier = "race"时,将始终返回0个结果

我想您想做这样的事情:

SELECT listingId FROM advalues 
    WHERE 
    (identifier="activity" AND value IN("Mellem","Højt"))
    OR 
    (identifier="race" AND value IN("Alaskan Husky"))