2013-11-28 42 views
0

這裏是上下文,我使用SQLite來存儲包含許多參數的應用程序數據,其中一些可以用幾種語言翻譯。在SQLite中定義一種宏或函數來停止一遍又一遍地複製相同的請求

爲此,我定義了一個名爲的表格,其中包含所有翻譯文件。每條消息由唯一索引標識,並且必須顯示翻譯字符串的每個參數都鏈接到表消息

例如,我有一個名爲ObdParameter包含所有OBD的參數我的應用程序可以讀取和該表的一些字段被翻譯成多國語言,如(OdbParameter.NameOdbParameter.Description表OdbParameter.Help)。

如果我想選擇存儲在數據庫中的所有OBD參數,我使用下面的SQLite請求。 (只有參數的標識符和名稱被選中)。

SELECT o.IdObdParameter, 
COALESCE(NULLIF(trim(m.Message), ''), mDef.Message, '') AS Name 
FROM ObdParameter o 
-- JOINTURE on the name 
LEFT JOIN Message m ON m.IdString=o.IdName AND m.CodeLanguage='ENG' 
LEFT JOIN Message mDef ON mDef.IdString=o.IdName AND mDef.CodeLanguage='FRE' 
ORDER BY Name; 

有了這個請求時,SQLite加入英語翻譯ObdParameter.IdName但如果沒有英文翻譯,同時也加入了法語翻譯(這是默認的語言),如果最後沒有法語翻譯它返回一個空字符串。

這是非常方便的,但它使請求複雜的閱讀。

例如,如果我想要選擇所有OBD參數及其描述和相關幫助,我必須在下面編寫請求。

SELECT o.IdObdParameter, 
COALESCE(NULLIF(trim(m.Message), ''), mDef.Message, '') AS Name 
COALESCE(NULLIF(trim(m1.Message), ''), m1Def.Message, '') AS Description 
COALESCE(NULLIF(trim(m2.Message), ''), m2Def.Message, '') AS Help 
FROM ObdParameter o 
-- JOINTURE on the name 
LEFT JOIN Message m ON m.IdString=o.IdName AND m.CodeLanguage='ENG' 
LEFT JOIN Message mDef ON mDef.IdString=o.IdName AND mDef.CodeLanguage='FRE' 
-- JOINTURE on the descritpion 
LEFT JOIN Message m1 ON m1.IdString=o.IdDescription AND m1.CodeLanguage='ENG' 
LEFT JOIN Message m1Def ON m1Def.IdString=o.IdDescription AND m1Def.CodeLanguage='FRE' 
-- JOINTURE on the help 
LEFT JOIN Message m2 ON m2.IdString=o.IdHelp AND m2.CodeLanguage='ENG' 
LEFT JOIN Message m2Def ON m2Def.IdString=o.IdHelp AND m2Def.CodeLanguage='FRE' 
ORDER BY Name; 

它工作得很好。

但我不知道是否有一種方法來定義一種宏或功能的,所以我可以寫上一個請求爲:

SELECT o.IdObdParameter, 
GET_TRANSLATION(m) AS Name 
GET_TRANSLATION(m1) AS Description 
GET_TRANSLATION(m2) AS Help 
FROM ObdParameter o 
-- JOINTURE on the name 
JOIN_TRANSLATION(m, o.IdName, 'ENG', 'FRE') 
-- JOINTURE on the descritpion 
JOIN_TRANSLATION(m1, o.IdDescription , 'ENG', 'FRE') 
-- JOINTURE on the help 
JOIN_TRANSLATION(m2, o.IdHelp, 'ENG', 'FRE') 
ORDER BY Name; 

這是簡單得多閱讀和使用。

SQLite是否支持此功能?

+0

我不認爲這是可能的任何DBMS。如果所有這些都是客戶端功能 - 您的SQL客戶端工具將需要將「JOIN_TRANSLATION()」宏擴展爲有效的SQL。如果你爲每種語言創建一個視圖,那麼你可以使事情更容易,然後你可以做一個'JOIN v_en_messages ON ...'。我不知道SQLite,但如果它支持'NATURAL JOIN'並且正確地命名了視圖中的列,那麼您也可以擺脫將連接列放在那裏(但我不會建議對於生產代碼,即時查詢) –

+0

視圖不完全是我需要的因爲我也必須通過過濾來選擇OBD參數(例如'WHERE ObdParameter.LocalCode = 5'),所以我不會爲所有可能的過濾器創建一個視圖。數據庫中有許多其他表。 –

+0

我會看看函數[sqlite3_create_function()](http://www.sqlite.org/c3ref/create_function.html)... –

回答

0

有數據庫可以在存儲過程中生成動態SQL,但SQLite是嵌入式數據庫;它被設計成用作以「真實」編程語言編寫的應用程序的一部分。

您必須在您的應用程序中實現此功能。

嵌入式數據庫沒有客戶端/服務器通信開銷;您可以使用三個查詢來讀取這三個值。

+0

我知道SQLite不支持存儲過程導致它的客戶端/服務器數據庫引擎這就是爲什麼我想知道,而解決方法是可用的。 –

相關問題