SQL在'in group'中选择第一个找到的值

时间:2013-08-07 14:40:52

标签: mysql select

是否可以选择列表中匹配的第一行?

bar: 栏'栏' 值:value2,value3

SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3');

选择value2并返回。

提前致谢

编辑:

我期待的价值观是:

Foo
Foobar
Foobarsome
Foobarsomething

我根据字符串的长度来确定这个,但如果没有找到,我也需要一个默认值。让我们说'没有',但没有什么比foobar更大,可能是一个有效的价值。

3 个答案:

答案 0 :(得分:2)

您可以查询:

 SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3') LIMIT 1;

但没有额外的排序,它不是确定性的,第一行将是你的结果。

答案 1 :(得分:0)

Mysql应该可以使用..

SELECT * FROM foo WHERE bar IN(' value',' value2',' value3') 限制0,1;

你能写下你的预期输出吗?它会让它变得更容易......

答案 2 :(得分:0)

您可以在ORDER BY子句中使用CASE语句根据列值指定顺序。然后使用可以使用LIMIT在结果中只选择一行。

SELECT * FROM foo 
WHERE bar IN ('value','value1','value2')
ORDER BY CASE bar WHEN 'value' THEN 1 WHEN 'value1' THEN 2 WHEN 'value2' THEN 3 ELSE 100 END
LIMIT 1;

我在SQL Fiddle上测试了这个例子。

更新:原始海报编辑了这个问题,并补充说他想对字符串长度进行排序,如果没有结果,则返回默认值'nothing'。

SELECT * FROM foo 
WHERE bar IN ('value','value1','value2')
ORDER by CASE bar WHEN 'value' THEN 1 WHEN 'value1' THEN 2 WHEN 'value2' THEN 3 ELSE 100 END
LIMIT 1;


SELECT bar FROM
(
  SELECT bar, 0 as SortOrder FROM foo 
  WHERE bar IN ('value','value1','value2')

  UNION
  SELECT 'nothing' as bar, 999 as SortOrder

) as x
ORDER BY SortOrder, LENGTH(bar)
LIMIT 1;

您可以在SQL Fiddler中看到更新查询。

此解决方案通过使用UNION将默认值“nothing”与结果相结合,并且还包含“SortOrder”列。 UNION的查询是按SortOrder列排序,以便将默认值排序到结果的底部,然后结果按条的长度排序。最后有LIMIT 1子句,因此如果它是唯一的记录,则在最终结果中出现默认值'nothing',否则返回在'in group'集合中匹配的最短字符串。