2014-03-13 78 views
1

我有一個表tinyint列。我的應用程序級別中有一個轉換器,它將顯示整數的文本表示形式,但是現在我希望能夠在該列上搜索文本而不添加另一列來保存整數的文本表示形式。我試過CASE,但在where條款中不允許。如何在MySQL中對tinyint列進行文本搜索?

是否有可能像搜索tinyint那樣彷彿是varchar有一些魔力?

+0

請提供您嘗試過的SQL。沒有更多的信息,沒有太多的人能夠幫助你。 –

回答

1

取而代之的是WHERE子句中CASE,您可以構建匹配字符串的TINYINT值哪個邏輯AND條件下,利用輸入文字和字符串文字。您的應用程序代碼必須在每種情況下提供<input_text>的值。

WHERE 
    (<input_text> = 'ZERO' AND column_value = 0) 
    OR (<input_text> = 'ONE' AND column_value = 1) 
    OR (<input_text> = 'TWO' AND column_value = 2) 

如果輸入文本與字符串文字相匹配,則會評估匹配整數的其餘條件。顯然,<input_text>只能匹配零個或一個文字字符串。

由於TINYINT支持255個值的範圍,所以很明顯這會很快變得笨拙。您可以考慮將TINYINT列更改爲ENUM type

ALTER TABLE your_table MODIFY column_name ENUM('ONE','TWO','THREE',....) 

也許比任一這些更好的選擇(如果ENUM不能使用)是創建在應用程序代碼的數據結構映射的字符串,並且執行的查找之後通過將整數值到SQL查詢其應用程序代碼中對應的字符串值

最後,RDBMS中的一個類似的選項整體當然是創建另一個將int值映射到字符串並對其執行JOIN的表。

+0

我正在使用Doctrine ORM和枚舉不能是選擇。謝謝。 – PMoubed

+0

@PMoubed如果你不能使用ENUM,使用上面的條件構造一個'WHERE'子句可能是你唯一的選擇,除了在應用程序代碼中存儲地圖值。 –

+0

是啊,你是對的,謝謝。 – PMoubed

相關問題