2011-05-11 58 views
1

我有一個SQL查詢:在SQL查詢子句

SELECT NAME 
FROM CATEGORY_LANGUAGE 
WHERE 
CATEGORY_ID IN (11, 22) 
AND LANGUAGE_ID=1 

在此查詢:

11 - > AA

22 - > BB

我想記錄要這樣返回:

AA

BB

當運行該查詢返回:

BB

AA

請,讓我知道進一步闡述我的問題。

+2

我想我很困惑。它是否以錯誤的順序回來?如果是這樣,難道你不能只用一個ORDER BY來修復它嗎? – IAmTimCorey 2011-05-11 05:59:36

+1

我假設你想要以與SQL中「IN元組」相同的方式排序結果,而不一定按字母順序排列? – 2011-05-11 06:00:09

+0

@Doc Brown:「元組」? 'CATEGORY_ID IN(11,22)'僅僅是'(CATEGORY_ID = 11或CATEGORY_ID = 22)'的語法糖。你有沒有聽說過邏輯或關聯法? SQL引擎當然可以按照它認爲合適的順序自由評估這些引擎。什麼樣的元組被訂購? :) – onedaywhen 2011-05-11 07:28:16

回答

2

這裏是新的東西:

SELECT NAME 
FROM CATEGORY_LANGUAGE 
WHERE 
    CATEGORY_ID IN (11, 22) 
    AND LANGUAGE_ID=1 
ORDER BY 
    field(CATEGORY_ID, 11, 22) 

這是照顧到MySQL。只需確保field()函數中的ID與in()函數中的ID相同。

+0

您閱讀我的評論,是嗎? – 2011-05-11 06:02:07

+0

@Doc我們同時發佈:p是的,在 – 2011-05-11 06:03:10

+0

之後所以,誰投票贊成,你知道這可能不是OP的解決方案之後? – 2011-05-11 06:05:48

0
SELECT 
    NAME 
FROM 
    CATEGORY_LANGUAGE 
WHERE 
    CATEGORY_ID IN (11, 22) 
AND 
    LANGUAGE_ID=1 
ORDER BY NAME ASC 

也許這是一個順序問題

+0

嗯,我不相信會工作(沒有專欄CATEGORY_LANGUAGE) – 2011-05-11 06:03:43

+0

謝謝你@Doc。我錯過了 – Ibu 2011-05-11 06:04:53

+1

,你錯過了我對OP問題的評論,我想?順便說一句,DESC將按降序排列輸出(bb在aa之前)。 – 2011-05-11 06:06:40

1

如果你總是希望通過CATEGORY_ID排序:

SELECT NAME 
FROM CATEGORY_LANGUAGE 
WHERE 
CATEGORY_ID IN (11, 22) 
AND LANGUAGE_ID=1 
ORDER BY CATEGORY_ID 

如果,另一方面,你總是希望有順序相同在你的IN-Clause中,我會使用某種INSTR()魔術(取決於你的RDBMS,這適用於Oracle;我爲了可讀性而放置連字符,並避免可能的錯誤,如果一個category_id是另一個的前綴):

SELECT NAME 
FROM CATEGORY_LANGUAGE 
WHERE 
CATEGORY_ID IN (11, 22) 
AND LANGUAGE_ID=1 
ORDER BY INSTR('11-22', TO_CHAR(CATEGORY_ID)); 

說明:TO_CHAR()將CATEGORY_ID轉換爲字符串,並且INSTR()返回第一個字符串在第一個字符串中找到的索引 - 在這裏,我們使用它從'11-22中提取category_id的排序順序」。

+0

你建議的查詢在某些ID上工作,而不在某個ID上工作。 – Ankit 2011-05-11 06:49:27

+0

@ankitjava你有沒有按預期工作的例子? – 2011-05-11 06:58:34

+0

對於id's =「1303393383,1303293381」結果會正確返回。但是當Id更改爲「1301462530,1301642485」結果順序已更改。請讓我知道進一步詳細說明。 – Ankit 2011-05-11 07:15:02

1

的SQL代碼

CATEGORY_ID IN (11, 22) 

只是語法糖

(CATEGORY_ID = 11 OR CATEGORY_ID = 22) 

的SQL engien是免費的,以評估這些謂詞以任何順序是認爲合適的(提示:OR是聯想)。

它可能看起來像一個集合,關係,表,元組,列表,袋等,但不是。

SQL只有一個數據結構:表。因此,將您的值放入臨時表的行(可能是CTE)。一張表沒有任何固有的排序,所以如果這是一個要求,你需要給出一個排序順序屬性。然後,您可以將登臺表JOIN轉移到目標基表。

這裏的一些標準SQL作爲一個例子:

WITH STAGING (CATEGORY_ID, SORT_ORDER) 
    AS 
    (
     SELECT CATEGORY_ID, SORT_ORDER 
     FROM (
       VALUES (11, 0), 
        (22, 1) 
      ) AS STAGING (CATEGORY_ID, SORT_ORDER) 
    ) 
SELECT C1.NAME, S1.SORT_ORDER 
    FROM CATEGORY_LANGUAGE AS C1 
     INNER JOIN STAGING AS S1 
      ON C1.CATEGORY_ID = S1.CATEGORY_ID 
WHERE LANGUAGE_ID = 1 
ORDER 
    BY SORT_ORDER;