1

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

bar:列'bar'值:value2,value3

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

它选择 value2 并返回。

提前致谢

编辑:

我期望的值是:

Foo
Foobar
Foobarsome
Foobarsomething

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

4

3 回答 3

2

您可以查询:

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

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

于 2013-08-07T14:48:46.073 回答
0

Mysql应该与..

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

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

于 2013-08-07T14:48:28.383 回答
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上测试了这个例子。

更新:原始发帖人编辑了问题并补充说他想对字符串长度进行排序,如果没有结果,则返回默认值“无”。

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 子句,因此如果它是唯一记录,则默认值“无”出现在最终结果中,否则返回“组内”集中匹配的最短字符串。

于 2013-08-07T15:04:27.620 回答