2015-05-28 73 views
2

我有一个表:SQL:在结果显示搜索参数,即使结果为空

MyTable的

ID | Name 
1 | ok 
2 | ok 
3 | ok 
4 | ok 

我想编写查询将返回在“IN”所使用的参数子句,即使结果为空(表中不存在此行)。

喜欢的东西:

SELECT 
    ID, 
    Name 

FROM MyTable 
WHERE ID in ('ABC', 'DEF', 1) 

期望的结果: (另外:X列未在规定的MyTable)

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') 
+0

出于好奇,你需要什么? – AdamMc331

+0

我需要检查另一个数据库中不存在的数据库中的ID(在MyTable中)。 – suz

回答

1

你不能这样做,从一个值IN列表;无法在结果集中返回这些值。这是不可能的。

结果集中的行必须从FROM子句中的某些rowsource返回。通常情况下,这是一个表,但我们也可以使用内联视图作为行源。

要返回您正在寻找的三排,考虑这个查询:

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 

请注意,parens内部的查询将替换通常是表的内容。该查询分配了别名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

+0

嘿,当然,'ABC'只在这个例子中使用(表明我想检索记录,肯定在列中不可用),并且它不存储在数据库中。感谢您的帮助和详细的解释!对此,我真的非常感激。 – suz

1

那是一个奇怪的期望的结果集,这里是一个办法做到这一点

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 ;