SQL: 在结果中显示搜索参数,即使结果为空
SQL: Show search parameter in result, even if result is null
我有一个 table:
MyTable
ID | Name
1 | ok
2 | ok
3 | ok
4 | ok
我想编写查询,将 return 参数用于 "IN" 子句,即使结果为空(table 中不存在这样的行)。
类似于:
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')
这是一个奇怪的所需结果集,这是一种实现方法
select
x.ID,
t.name from (
select 'abc' as ID
union all
select 'def'
union all
select '1'
)x left join my_table t on t.ID = x.ID ;
你不能从 IN
列表中的值中做到这一点;不可能 return 结果集中的那些值。这不可能。
结果集中的行必须从 FROM 子句中的某些行源return编辑。通常,这是一个 table,但我们也可以使用内联视图作为行源。
要 return 您要查找的三行,请考虑以下查询:
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
如果我们将其包裹在括号中,并为其分配一个别名,我们就可以像 table 一样引用它。例如:
SELECT v.X
FROM (
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
) v
请注意,括号内的查询替换了通常的 table。该查询分配了一个别名 v
;我们基本上创建了一个名为 v
.
的 table
一旦克服了困难,就很容易了。向要从匹配值
中检查的 table 添加外连接
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
将具有单一数据类型 returned,您将希望它与 ID
列的数据类型相匹配。 (我怀疑 'ABC'
和 'DEF'
只是您示例中给出的一些占位符。)关键是,要注意隐式数据类型转换。如果您需要进行数据类型转换,通常最安全的做法是使用适当的表达式来明确这些转换,例如CAST(x
、CONVERT(x
、STR_TO_DATE(x
、x+0
等
我有一个 table:
MyTable
ID | Name
1 | ok
2 | ok
3 | ok
4 | ok
我想编写查询,将 return 参数用于 "IN" 子句,即使结果为空(table 中不存在这样的行)。
类似于:
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')
这是一个奇怪的所需结果集,这是一种实现方法
select
x.ID,
t.name from (
select 'abc' as ID
union all
select 'def'
union all
select '1'
)x left join my_table t on t.ID = x.ID ;
你不能从 IN
列表中的值中做到这一点;不可能 return 结果集中的那些值。这不可能。
结果集中的行必须从 FROM 子句中的某些行源return编辑。通常,这是一个 table,但我们也可以使用内联视图作为行源。
要 return 您要查找的三行,请考虑以下查询:
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
如果我们将其包裹在括号中,并为其分配一个别名,我们就可以像 table 一样引用它。例如:
SELECT v.X
FROM (
SELECT 'ABC' AS `X`
UNION ALL
SELECT 'DEF'
UNION ALL
SELECT 1
) v
请注意,括号内的查询替换了通常的 table。该查询分配了一个别名 v
;我们基本上创建了一个名为 v
.
一旦克服了困难,就很容易了。向要从匹配值
中检查的 table 添加外连接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
将具有单一数据类型 returned,您将希望它与 ID
列的数据类型相匹配。 (我怀疑 'ABC'
和 'DEF'
只是您示例中给出的一些占位符。)关键是,要注意隐式数据类型转换。如果您需要进行数据类型转换,通常最安全的做法是使用适当的表达式来明确这些转换,例如CAST(x
、CONVERT(x
、STR_TO_DATE(x
、x+0
等