2011-05-08 44 views
5

说我有如下表:SQL:如何返回一个不存在的行?

================================================= 
| color_id | parent_id | language_id | name  | 
================================================= 
| 1  | 50  | 1   | Black | 
------------------------------------------------- 

然后说我需要的行WHERE parent_id = 50 AND language_id = 2。显然,根据我的示例表,我什么也得不到。然而,我仍然需要一个结果 - 可能是这样的:

================================================= 
| color_id | parent_id | language_id | name  | 
================================================= 
| NULL  | 50  | 2   | NULL  | 
------------------------------------------------- 

有没有办法在SQL中做到这一点?

+0

出于好奇,为什么这样做?这是一个有趣的问题,但我很难想出它的一个原因。 – David 2011-05-08 03:15:47

+1

@David:处理默认值... – 2011-05-08 03:27:04

+1

@David:OMG Ponies是对的。我正在尝试使用COALESCE来进行语言翻译(比如,如果某个特定语言的'name'存在,则使用它;否则使用存在的第一个非NULL'name')。问题在于特定语言的行不存在时,我似乎无法使用COALESCE。如果我得到一个NULL值的行,那么我可以使用我的COALESCE解决方案。 – StackOverflowNewbie 2011-05-08 03:56:17

回答

7

你可以做两种可能有效的记录和默认的联合查询,然后选择第一个:

SELECT * FROM 
(SELECT color_id, parent_id, language_id, name, 1 as order_rank 
FROM some_table 
WHERE parent_id = %parent_id% AND language_id = %language_id% 
UNION 
SELECT NULL, %parent_id%, %language_id%, NULL, 2 as order_rank 
) 
ORDER BY order_rank 
LIMIT 1 

(编辑静态值排序由OMG小马建议)

+0

+1非常好的解决方案 – Johan 2011-05-08 03:14:59

+0

我确定有IF或CASE的东西,但MySQL语法不是我通常习惯的味道。 – MPelletier 2011-05-08 03:16:53

+0

+1:我只会添加一个静态定义的值来排序,以确保当搜索到的值存在时返回正确的行。 – 2011-05-08 03:19:17

0

尝试使用LEFT JOIN的工作陈述。我可能没有这样做100%,但你的一部分的试验和错误应该使这项工作。

SELECT table1.field1, table1.field2, table2.field3, table2.field4 
FROM my_table table1 
LEFT JOIN my_table table2 ON table1.field1=table2.field1 OR table1.field2=table2.field2 
0

左强制固定值第一个表应该加入工作。

select 
     YourTable.color_id, 
     ForcedSQL1Record.parent_id, 
     ForcedSQL1Record.language_id, 
     YourTable.name 
    from 
     (select 50 as Parent_ID, 
       2 as Language_ID 
      from YourTable 
      limit 1) ForcedSQL1Record 
     left join 
     YourTable 
      on ForcedSQL1Record.Parent_ID = YourTable.Parent_ID 
      AND ForcedSQL1Record Language_ID = YourTable.Language_ID 
相关问题