2016-02-12 38 views
1

我想在顯示的記錄,以便在where子句.. 例如:如何顯示按where子句排序的表中的記錄?

select name from table where name in ('Yaksha','Arun','Naveen'); 

它顯示Arun,Naveen,Yaksha (alphabetical order)
我想它顯示爲同一順序i.e 'Yaksha''Arun','Naveen'
如何顯示此... 我正在使用oracle db。

+1

你有沒有想過','btwn''Yaksha''Arun''? – Praveen

+0

您是使用固定的值列表還是變量 - 在哪些情況下值是從哪裏來的? –

+0

@Praveen,我正在使用,在 – Charan

回答

4

添加此ORDER BY在查詢的結尾:

order by case name when 'Yaksha' then 1 
        when 'Arun' then 2 
        when 'Naveen' then 3 
     end 

(有沒有其他辦法可以拿到貨,你需要一個ORDER BY得到一個特定的結果集的順序。)

+0

它工作正常..ThanQ – Charan

2

可能有點笨重,但你可以創建自定義排序與case表達:

防止重複
SELECT * 
FROM  my_table 
WHERE name IN ('Yaksha', 'Arun','Naveen') 
ORDER BY CASE name WHEN 'Yaksha' THEN 1 
        WHEN 'Arun' THEN 2 
        WHEN 'Naveen' THEN 3 
     END ASC 

稍長的選擇,但一字符串文字是使用子查詢:

SELECT m.* 
FROM  my_table m 
JOIN  (SELECT 'Yaksha' AS name, 1 AS name_order FROM dual 
      UNION ALL 
      SELECT 'Arun' AS name, 2 AS name_order FROM dual 
      UNION ALL 
      SELECT 'Naveen' AS name, 3 AS name_order FROM dual) o 
     ON o.name = m.name 
ORDER BY o.name_order ASC 
2

你可以像下面這樣試試:如果你的列表是某種動態

SELECT * 
FROM  test 
WHERE name IN ( 'Yaksha', 'Arun', 'Naveen' ) 
ORDER BY instr (q'['Yaksha', 'Arun', 'Naveen']', name) ASC 

這種方式可能是有用的。

+0

instr是否返回每個名字的位置? q的目的是什麼? – jarlh

+0

是的,這個想法是,INSTR給出的位置,從而按照IN字符串排序; q'只是爲了避免對字符串進行任何操作,以防動態生成 – Aleksej

+0

@jarlh - 'q'表示[備用引用機制](http://docs.oracle.com/cd/E11882_01/server 0.112/e41084/sql_elements003。htm#SQLRF00218),它可以避免單引號的轉義。 (可能有用[這裏](http://stackoverflow.com/a/35358119/266304)* 8-) –

2

如果值的列表是動態的,或者您只是不想重複您可以使用的值(或濫用,取決於您的觀點)表集合,並將您的真實表加入table collection expression而不是使用IN

select your_table.name 
from table(sys.odcivarchar2list('Yaksha','Arun','Naveen')) t 
join your_table on your_table.name = t.column_value; 

通常會工作,但當然沒有order by語句不保證工作,所以你可以使用內嵌視圖分配的順序:

select your_table.name from (
    select row_number() over (order by null) as rn, column_value as name 
    from table(sys.odcivarchar2list('Yaksha','Arun','Naveen')) 
) t 
join your_table on your_table.name = t.name 
order by t.rn; 

這仍然依賴於row_number() over (order by null)使用集合中元素的順序;這依靠收集unnesting保存元素順序。我認爲這也不能保證,所以仍然存在一些風險。

+0

+1雖然涉及風險,但它完全回答了OP的需求,需要動態值。當然,它不能一概而論,因爲一般的答案不在現存問題的範圍之內。 –

相關問題