2012-10-10 88 views
-1

我有一個表的數據庫中有幾列說select1-option15 columns.The列中的數據可以爲null如果用戶沒有選擇它,否則它會'Y' 。我只需要獲取數據爲'y'的那些列。SQL查詢獲取多列數據

column_id choice1 choic2 choice3......15 

    1   null y  null 
    2   y  null null 

我怎樣才能得到這使用sql查詢給定的列ID?

+1

你試過了嗎? – freebird

+0

我對此沒有任何想法,我完全無能,所以我張貼在這裏。 – pars

回答

1

您試圖以與設計相反的方式使用數據庫表。

如果您應該根據某些條件從字段中選擇數據,則您正嘗試從數據表中選擇字段(列)。另外,當你有另一個選項添加到你的系統時會發生什麼?我假設你必須改變表格設計和所有使用表格的程序/應用程序來識別這個新選項。

創建一個包含行選項的表格會更好,然後爲用戶選擇所有行。從您的樣本數據(其中每個用戶只選擇一個選項),你將有兩行:

user_id option_number 
------- ------------- 
     1    2 
     2    1 

如果用戶1人選擇更多的選擇,您可以添加更多的行:

user_id option_number 
------- ------------- 
     1    2 
     1    5 
     1   10 
     1   15 
     2    1 

主要該表的密鑰將爲(user_id, option_number),以確保用戶不能兩次選擇相同的選項。與查找表(或約束)與所有可能的選項號碼的關係將防止選擇無效選項。

1

您沒有指定您正在使用的Oracle版本。但是你可以使用UNPIVOTUNION ALL查詢數據:

UNPIVOT版本(見SQL Fiddle With Demo):

select * 
from yourtable 
unpivot 
(
    val 
    for col in (choice1, choice2, choice3) 
) u 
where val = 'y' 

UNION ALL版本(見SQL Fiddle With Demo):

select * 
from 
(
    select columnid, 'choice1' col, choice1 val 
    from yourtable 
    union all 
    select columnid, 'choice2' col, choice2 val 
    from yourtable 
    union all 
    select columnid, 'choice3' col, choice3 val 
    from yourtable 
) x 
where val = 'y' 

做這個過程中,品牌數據可以在一列而非多列中輕鬆訪問。

+0

oracle版本是3.我無法運行unpivot查詢'col'在那裏指定什麼?和union根據我的要求,所有內容都不清楚 – pars

+0

@pars「col」只是列名的別名, 'val'是每個列下的值。如果你不能使用'UNPIVOT',那麼'UNION ALL'也會起作用。 – Taryn

+0

兩者都不適合我。其他解決方案? – pars