我有一张 table :
我的表格
ID | Name
1 | ok
2 | ok
3 | ok
4 | ok
我想编写一个查询,它将返回“IN”子句中使用的参数,即使结果为空(表中不存在此类行)。
类似于:
SELECT
ID,
Name
FROM MyTable
WHERE ID in ('ABC', 'DEF', 1)
期望的结果: (补充:MyTable中没有定义X列)
X | ID | Name
ABC | Null | Null
DEF | Null | Null
1 | 1 | ok
这可能吗?
我尝试过类似的方法:
SELECT
IFNULL(t2.ID,"?")
FROM MyTable t1
LEFT JOIN MyTable t2 ON t1.ID = t2.ID
AND t2.ID IN ('ABC')
最佳答案
您无法通过 IN
列表中的值执行此操作;不可能在结果集中返回这些值。这是不可能的。
结果集中的行必须从 FROM 子句中的某个行源返回。通常,这是一个表,但我们也可以使用内联 View 作为行源。
要返回您要查找的三行,请考虑以下查询:
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
如果我们将其括在括号中,并为其指定一个别名,我们就可以像引用表一样引用它。例如:
SELECT v.X
FROM (
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
) v
请注意,括号内的查询替换了通常的表。该查询分配一个别名v
;我们实际上创建了一个名为 v
的表。
一旦你克服了这个困难,一切就很容易了。将外部联接添加到要检查匹配值的表
SELECT v.X
, t.ID
, t.Name
FROM (
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
) v
LEFT
JOIN MyTable t
ON t.ID = v.X
ORDER BY v.X
注意:数据类型(字符串文字和数字文字)的混合有点奇怪...列 X
将返回单个数据类型,您将希望它与 ID
列的数据类型匹配。 (我怀疑 'ABC'
和 'DEF'
只是示例中给出的一些占位符。)重点是,要小心隐式数据类型转换。如果您需要进行数据类型转换,通常最安全的方法是使用适当的表达式进行显式转换,例如CAST(x
、CONVERT(x
、STR_TO_DATE(x
、x+0
) 等
关于mysql - SQL : Show search parameter in result, 即使结果为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30507261/