2013-01-10 26 views
0

任何人都有任何指針如何將通配符存儲在數據庫中,並查看字符串匹配的行?可以做到嗎?數據庫中的通配符

例如 DB包含這樣一個表:

two column table with wildcards in col one

所以john3136應該得到10倍他固定工資。 fred3136將獲得其正常工資的一半。 harry3136可能崩潰的應用程序,因爲沒有匹配的數據;-)

代碼需要做一些事情,如:

foreach(Employee e in all_employees) { 
    SELECT Multiplier FROM PayScales WHERE 
     //??? e.Name matches the PayScales.Name wildcard 
} 

謝謝!

編輯 這是一個現實世界的問題:我有一個包含通配符的參數文件。代碼當前遍歷員工,遍歷param文件尋找匹配 - 你可以看到爲什麼我想「databaserize」它;-)

通配符是可選的。該行可能會說「john3136」只匹配一名員工。 (真正的應用程序實際上並不是員工,因此即使在這個簡單的例子中它看起來像是矯枉過正也是有意義的)

打開一個選項:我在開始之前知道所有的員工姓名,所以我可以迭代並在臨時表中有效擴展通配符。 (所以如果我在起始表中有john3136 *,可能會根據員工名單擴展到john3136,john31366等)。我希望找到比這更好的方法,因爲它需要更多的維護(例如,如果我們添加功能來添加我們需要維護擴展通配符表的員工)。

+0

聽起來很脆弱...... –

+0

你可能不想存儲通配符,但你總是可以使用'LIKE' –

+0

你使用的是什麼DBMS? – ErikE

回答

0
SELECT * FROM payscales 
WHERE e.Name 
    LIKE regexp_replace(name, E'^\\*|\\*$', '%', 'g'); 

我不知道你正在使用哪個數據庫。上面的查詢在postgresql上工作,只需用%替換您的尾隨和前導通配符,即LIKE通配符。

如果不存在通配符,則它必須與完整字符串匹配。

+0

感謝您的回答,但不知道它是否適用於我。名稱列不必具有通配符 - 但它可以,因此通配符查詢不起作用,因爲它不是全局提供的。 – John3136

+0

該代碼似乎回答你的問題爲postgresql數據庫,使用'替換(名稱,'*','%')'而不是'regexp_replace(...)'將賦予更多數據庫平臺的可移植性(只要沒有名稱包含''%'') – Jasen