是否可以选择列表中匹配的第一行?
表bar
:列"bar"值:值2,值3
SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3');
它选择value2并返回。
提前感谢
编辑:
我期望的值是:
Foo
Foobar
Foobarsome
Foobarsomething
我根据字符串的长度来确定这一点,但如果找不到任何值,我也需要一个默认值。比方说"nothing",但nothing比foobar大,并且可能是一个有效值。
您可以查询:
SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3') LIMIT 1;
但如果没有额外的排序,第一行将是您的结果,这是不确定的。
您可以在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;
我在SQLFiddle上测试了这个例子。
更新:最初的发帖者编辑了这个问题,并补充说,他希望根据字符串长度进行排序,如果没有结果,则返回默认值"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;
您可以看到在SQLFiddler中运行的更新查询。
此解决方案的工作方式是使用UNION将默认值"none"合并到结果中,还包括一个"SortOrder"列。UNION'ed查询是Order By The SortOrder列,因此默认值将排序到结果的底部,然后结果将按条形长度排序。最后是LIMIT 1子句,因此如果它是唯一的记录,则默认值"nothing"将出现在最终结果中,否则将返回与"in group"集中匹配的最短字符串。
Mysql应该使用。。
选择*FROM foo WHERE栏IN('value','value2','value3')极限0,1;
你能写下你的预期产出吗?这会让事情变得更容易。。。