我有一個表的數據庫中有幾列說select1-option15 columns.The列中的數據可以爲null如果用戶沒有選擇它,否則它會'Y' 。我只需要獲取數據爲'y'的那些列。SQL查詢獲取多列數據
column_id choice1 choic2 choice3......15
1 null y null
2 y null null
我怎樣才能得到這使用sql查詢給定的列ID?
我有一個表的數據庫中有幾列說select1-option15 columns.The列中的數據可以爲null如果用戶沒有選擇它,否則它會'Y' 。我只需要獲取數據爲'y'的那些列。SQL查詢獲取多列數據
column_id choice1 choic2 choice3......15
1 null y null
2 y null null
我怎樣才能得到這使用sql查詢給定的列ID?
您試圖以與設計相反的方式使用數據庫表。
如果您應該根據某些條件從字段中選擇數據,則您正嘗試從數據表中選擇字段(列)。另外,當你有另一個選項添加到你的系統時會發生什麼?我假設你必須改變表格設計和所有使用表格的程序/應用程序來識別這個新選項。
創建一個包含行選項的表格會更好,然後爲用戶選擇所有行。從您的樣本數據(其中每個用戶只選擇一個選項),你將有兩行:
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)
,以確保用戶不能兩次選擇相同的選項。與查找表(或約束)與所有可能的選項號碼的關係將防止選擇無效選項。
您沒有指定您正在使用的Oracle版本。但是你可以使用UNPIVOT
或UNION 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'
做這個過程中,品牌數據可以在一列而非多列中輕鬆訪問。
你試過了嗎? – freebird
我對此沒有任何想法,我完全無能,所以我張貼在這裏。 – pars