2015-05-28 96 views
2

我有一個表:SQL:在結果顯示搜索參數,即使結果爲空

MyTable的

ID | Name 
1 | ok 
2 | ok 
3 | ok 
4 | ok 

我想編寫查詢將返回在「IN」所使用的參數子句,即使結果爲空(表中不存在此行)。

喜歡的東西:

SELECT 
    ID, 
    Name 

FROM MyTable 
WHERE ID in ('ABC', 'DEF', 1) 

期望的結果: (另外:X列未在規定的MyTable)

X | ID | Name 
ABC | Null | Null 
DEF | Null | Null 
1 | 1 | ok 

這可能嗎?

我已經試過類似:

SELECT 
IFNULL(t2.ID,"?") 

FROM MyTable t1 
LEFT JOIN MyTable t2 ON t1.ID = t2.ID 
AND t2.ID IN ('ABC') 
+0

出於好奇,你需要什麼? – AdamMc331

+0

我需要檢查另一個數據庫中不存在的數據庫中的ID(在MyTable中)。 – suz

回答

1

你不能這樣做,從一個值IN列表;無法在結果集中返回這些值。這是不可能的。

結果集中的行必須從FROM子句中的某些rowsource返回。通常情況下,這是一個表,但我們也可以使用內聯視圖作爲行源。

要返回您正在尋找的三排,考慮這個查詢:

SELECT 'ABC' AS `X` 
    UNION ALL 
    SELECT 'DEF' 
    UNION ALL 
    SELECT 1 

如果我們總結,在括號,併爲它指定一個別名,大家可以參考一下,像一個表。例如:

SELECT v.X 
    FROM (
     SELECT 'ABC' AS `X` 
      UNION ALL 
     SELECT 'DEF' 
      UNION ALL 
     SELECT 1 
     ) v 

請注意,parens內部的查詢將替換通常是表的內容。該查詢分配了別名v;我們基本上創建了一個名爲v的表。

一旦你完成了這個駝峯,這很容易。添加一個外部聯接要從匹配的值

檢查
SELECT v.X 
    , t.ID 
    , t.Name 
    FROM (
     SELECT 'ABC' AS `X` 
      UNION ALL 
     SELECT 'DEF' 
      UNION ALL 
     SELECT 1 
     ) v 
    LEFT 
    JOIN MyTable t 
    ON t.ID = v.X 
ORDER BY v.X 

注表:X是要數據類型(字符串文字和數字文字)的組合是一個有點奇怪...列有一個數據類型返回,你會希望它匹配ID列的數據類型。 (我懷疑'ABC''DEF'只是您示例中給出的一些佔位符。)要點是,要小心隱式數據類型轉換。如果您需要進行數據類型轉換,通常最安全的方法是使用適當的表達式來明確表示,例如CAST(x,CONVERT(x,STR_TO_DATE(x,x+0

+0

嘿,當然,'ABC'只在這個例子中使用(表明我想檢索記錄,肯定在列中不可用),並且它不存儲在數據庫中。感謝您的幫助和詳細的解釋!對此,我真的非常感激。 – suz

1

那是一個奇怪的期望的結果集,這裏是一個辦法做到這一點

select 
x.ID, 
t.name from ( 
    select 'abc' as ID 
    union all 
    select 'def' 
    union all 
    select '1' 
)x left join my_table t on t.ID = x.ID ;