是否可以选择列表中匹配的第一行?
表bar
:
栏'栏'
值:value2,value3
SELECT * FROM `foo` WHERE `bar` IN ('value','value2','value3');
选择value2并返回。
提前致谢
编辑:
我期待的价值观是:
Foo
Foobar
Foobarsome
Foobarsomething
我根据字符串的长度来确定这个,但如果没有找到,我也需要一个默认值。让我们说'没有',但没有什么比foobar更大,可能是一个有效的价值。
答案 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'集合中匹配的最短字符串。