使用IN子句选择查询:填充空白

时间:2011-01-03 08:20:09

标签: mysql sql

我在C#中遇到以下MySQL查询问题:

给定一个字符串列表,我想查询数据库中是否有与所述字符串匹配的行。字符串是唯一的,因为每个字符串匹配不超过一行。今天,我的查询看起来像这样:

SELECT Id FROM SomeTable 
WHERE SomeColumn IN("foo", "bar", "baz")

现在,理想情况下,我希望能够将查询结果直接映射到我在IN子句中提供的字符串列表中:

String                         Returned ID
------------------------------------------
foo                            123
bar                            NULL        <-- Missing row filled with NULL
baz                            42

只要我传递给查询的所有字符串都匹配一行,这就可以正常工作。但是,当缺少一个时,我想用空填充空白,如上例所示。

有没有办法实现这个目标?


编辑:我应该指出,解决方案必须扩展到很多字符串。我现在这样做的方式是我通过IN子句一次传递100个。

3 个答案:

答案 0 :(得分:2)

您可以做的是SELECT作为结果集的字符串集,然后LEFT JOIN上的SomeTable.SomeColumn

答案 1 :(得分:2)

可以这样做:

SELECT 
  helper.SomeColumn,
  SomeTable.Id 
FROM  
  (
   SELECT 'foo' AS SomeColumn
   UNION SELECT 'bar'
   UNION SELECT 'baz'
  ) AS helper
  LEFT JOIN SomeTable ON SomeTable.SomeColumn = helper.SomeColumn 

当然,您可以事先创建辅助表(作为临时表)而不是内联。

无论如何,也许只是执行您的查询(WHERE SomeColumn IN (...))并简单地找出应用程序中缺少的行,它更智能,更高效。无论如何你都会遍历它们,所以你会注意到。

答案 2 :(得分:1)

试试这个:

SELECT Id 
    FROM  (
                SELECT "foo" SomeColumn
                UNION ALL
                SELECT "bar" AS SomeColumn
                UNION ALL
                SELECT "baz" AS SomeColumn 
             ) b
             LEFT JOIN 
             SomeTable a
ON  a.SomeColumn = b.SomeColumn