我在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个。
答案 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