2011-12-28 37 views
0

假設有一個表具有許多屬性字段,如:MySQL的 - 選擇其中的所有其它列= 0

​​

其中q,A,C,d等表示int字段其的不定數生成名稱(也在運行時創建)

如何選擇約束條件,即某些特定字段是特定數字,而其他所有字段都是0?

(例如)a = 1,c = 5,其他都是0?


更新:

我猜我要求的是,如果有一些「全面」的功能或東西在那裏我可以去「所有其它= 0」(或類似的東西) 。

與正火的問題是,即使加入後,我還是要檢查兩個特定的非零值,以及是否所有其他字段(或歸一化的字段)0


具體應用:

化學化合物的表

 
id 
name 
C 
Fe 
Cl 
H 
. 
. 
. 
(etc - fields are added when new compound insert contains elements not listed) 

例如行:

 
name = Hydrochloric acid 
C = 0 
Fe = 0 
Cl = 1 
H = 1 
. 
. 
. 
(everything else = 0) 

與具有簡單SELECT * FROM table WHERE H=1 AND Cl = 1的問題是,它也包括其他情況下,如C氯H(其中,即使它具有C = 1,它的選擇,因爲氯和H都是1爲好)

這就是爲什麼我想弄清楚如何選擇它在所有其他領域都是0的地方!

+3

等等,你改變該表可能每次頁面加載? – Interrobang 2011-12-28 00:54:24

+0

你如何/在哪裏建立這個聲明? – 2011-12-28 00:59:05

+0

alter if字段不存在是一個單獨的語句。插入是另一種說法。 – ina 2011-12-28 01:11:08

回答

1

這不是一個現實的情況。你永遠不會有無限數量的int字段,因爲你不能只修改沒有ALTER語句的表(僅在運行時)。至少,你不應該。

+0

好吧,這正是我所做的:我在運行時使用ALTER修改表格 – ina 2011-12-28 01:10:35

+0

因此很容易處理它。每次修改表格時只需添加一個新字符串,然後像下面這樣檢查: var string =「c = 0」; 「選擇*從例如哪裏a = 1和b = 5和」+「字符串」(如果您添加列「c」) – javidgon 2011-12-28 01:20:38

+0

我試圖避免必須顯式聲明0的...查看更新的問題對於具體的例子 – ina 2011-12-28 01:38:01

1

實際上,您無法在表格中確定無限數量的列 - 您僅限於明確的數量。在這種情況下,你只需使用:

... where a = 1 and c = 5 and q = 0 and b = 0 and d = 0 and ... 

如果只是意味着數量是一定的,但您的應用程序可能會改變使用的列數,那麼查詢將需要在運行時也產生,使用相同的信息。例如,如果在運行時未使用d,則它將不在查詢中。

但是,這是一個非常糟糕的設計表,你應該考慮更好地對它進行標準化,比如將這些屬性轉移到一個單獨的表中(每個表中有一個屬性),並將它們鏈接回原始表,id字段,如:

BaseTable: 
    id   integer  primary key 
    datetime timestamp 
OtherTable: 
    id   integer  references BaseTable(id) 
    attribute char(1) 
    text  varchar(50) 
    primary key (id,attribute) 

這種模式將允許每個id上的任意屬性。


根據您的意見,你基於某些外部因素改變了表,我認爲這就是我們在DBA的世界會叫一個「有趣」的設計決策:-)

我會強烈建議不要,但是,如果您認爲適合忽略該建議,則可以在大多數DBA實現中獲取元數據。

例如,MySQL在INFORMATION_SCHEMA模式中有一個COLUMNS table模式,您可以使用它來枚舉給定表的所有列。使用它,您可以動態構建基於任意複雜表的有效SQL語句。

不是說這是一個的想法,只是這是可能的。

+0

我想我要問的是,如果有一些「整體」功能或什麼地方我可以去「WHERE ALL OTHERS = 0」(或類似的東西)......正常化的問題是我仍然需要檢查所有其他類型爲0的情況,但是之後我需要額外加入 – ina 2011-12-28 01:12:29

+0

標準SQL中沒有全局函數,也不知道我在遵循任何特定於供應商的實現中對此的任何擴展。 – paxdiablo 2011-12-28 01:16:21

+0

我想我沒有看到如何規範化它,以便產生的選擇條件變得更容易。 (有關具體示例,請參閱上面的更新問題) – ina 2011-12-28 01:36:56

0

您構建這樣的事情:

WHERE a=1 
    AND c=5 
    AND d=0 
    AND e=0 
    ... 

或本:

WHERE (a, c, d, e, ...) = 
     (1, 5, 0, 0, ...) 

有沒有像:

WHERE ALL OTHERS = 0 

如果反覆更改表結構,你應該動態地改變q uery也是。但這不是一個好設計。您應該對錶格進行規格化(可能通過將表格拆分成2個表格並將重複的列更改爲一列,以便數據從多列到一列但多行)。在OP的編輯

的化學物質可能正常化後


更新 - 元素:

Compound 
-------- 
CompoundId Int   Primary Key 
Name   Varchar(250) Unique 
...other stuff 

Element 
------- 
ElementCode Char(2)  Primary Key 
Name   Varchar(50) Unique 

Structure 
--------- 
CompoundId Int 
ElementCode Char(2) 
Ratio  Int 
Primary Key (CompoundId, ElementCode) 
Foreign Key (CompoundId) 
    References Compound(CompoundId) 
Foreign Key (ElementCode) 
    References Element(ElementCode) 

樣本數據:

CompoundId Name 
------------------------------ 
1   Hydrochloric acid 
2   Water 
3   Glucose 

ElementCode Name 
--------------------- 
H   Hydrogen 
C   Carbon 
O   Oxygen 
Cl   Chlorium 

CompoundId ElementCode Ratio 
------------------------------ 
1   H   1 
1   Cl   1 
2   H   2 
2   O   1 
3   H   12 
3   C   6 
3   O   6 
+0

我想我要問的是,如果有一些「整體」功能或某些地方我可以去「WHERE ALL OTHERS = 0」(或類似的東西) – ina 2011-12-28 01:11:55

相關問題