2013-08-07 48 views
1

可以選擇列表中匹配的第一行嗎?SQL在'in group'中選擇第一個找到的值

bar: 列 '酒吧' 值:值2,值3

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

它選擇值2和回報。

在此先感謝

編輯:

我期待值是:

Foo 
Foobar 
Foobarsome 
Foobarsomething 

我確定這基於字符串的長度,但我也需要,如果沒有默認值被發現。讓我們說'沒有',但沒有什麼比foobar更大,可能是一個有效的價值。

+1

你使用什麼數據庫服務器和版本? MySQL的?甲骨文? DB2? MS SQL? – MrSimpleMind

+0

當前MySQL – John

+0

ORDER BY FIELD()LIMIT 1 – Strawberry

回答

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的查詢是Order By SortOrder列,以便將默認值排序到結果的底部,然後結果按條的長度排序。最後,有LIMIT 1子句,所以如果最終結果是唯一記錄,那麼缺省值'nothing'將出現,否則返回'in group'集合中匹配的最短字符串。

+0

案件實際上做了什麼? ORDER BY CASE'fieldName' WHEN'someValue'THEN'這是什麼? – John

+0

以下是[CASE](http://dev.mysql.com/doc/refman/5.0/en/case.html)聲明的MySQL文檔。它類似於其他編程語言中的switch語句或大的If-ElseIf-ElseIf ... Else語句。我經常看到它在查詢的SELECT子句中使用,但也可以在ORDER BY中使用。 –

0

Mysql的應與..工作

SELECT * FROM foo其中條IN( '值', '值2', '值3') LIMIT 0,1;

你能寫出你的預期輸出嗎?這將使它更容易...

+0

我編輯了我的問題。 – John

2

可以查詢:

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

但是,如果沒有額外的排序是不確定性的,這第一排將是你的結果。

+0

這不會返回列表中的第一個結果。如果實際上退回最後一個? 'bar'IN('fooBarSome','fooBar','foo')如果foobar和foo被找到,它會返回foo,但我正在尋找第一個找到的記錄。在這個案例中'foobar'。 – John

+0

好的,那不是什麼IN謂詞給你。根據你的評論,你想'如果第n個值不存在,給我第(n + 1)個值。但是,你對你的問題所做的編輯,說了一些關於多個結果值的東西..現在我很困惑:) – contradictioned

+0

我有一個可能的值列表(這個列表的這個順序是由用戶組成的)第一個值在列表中是我想要選擇的那個。 – John

相關問題