我正在將數據從一個系統導入另一個系統。前者關閉字母數字字段,而後者則需要數字整數字段。我想找到或寫一個函數,我可以提供字母數字值,並讓它返回一個數字,該數字對於傳遞的值是唯一的。sql函數將字符字段轉換爲數字字段
我的第一個想法是做一個哈希,但當然任何內置哈希的結果都將包含字母,並且在技術上可能(但不太可能)哈希可能不是唯一的。
我的第一個問題是,是否有任何內置的SQL,我忽略,以及我想聽到最簡單的方法來實現這樣的功能的建議。
我正在將數據從一個系統導入另一個系統。前者關閉字母數字字段,而後者則需要數字整數字段。我想找到或寫一個函數,我可以提供字母數字值,並讓它返回一個數字,該數字對於傳遞的值是唯一的。sql函數將字符字段轉換爲數字字段
我的第一個想法是做一個哈希,但當然任何內置哈希的結果都將包含字母,並且在技術上可能(但不太可能)哈希可能不是唯一的。
我的第一個問題是,是否有任何內置的SQL,我忽略,以及我想聽到最簡單的方法來實現這樣的功能的建議。
這裏是一個可能會從底部10(整數)轉換爲基底36(字母)的函數,然後再返回:
https://www.simple-talk.com/sql/t-sql-programming/numeral-systems-and-numbers-conversion-in-sql/
你可能會發現得到的數目過大的召開一個整數,但。
是的,我有點想知道這是否是可行的,因爲整數字段的大小限制。我會明天檢查一下,然後穿過我的手指:) – 2013-04-30 03:57:37
否則,請使用所提及的代理鍵方法 - 如果您正在進行大量系統合併工作,您會發現您會傾向於此 - 它更簡單,更一致。 – 2013-04-30 05:16:22
如果原始數據被稱爲是整數,你可以使用CAST:
SELECT CAST(varcharcol AS INT) FROM Table
你可以串聯的字符串的每個字符的ASCII值,並把結果作爲一個BIGINT。
我不認爲這會產生一個獨特的結果。映射/連接/轉換'1 1 1'將與「11 1」或「111」相同。由於ASCII具有如此有限的字符範圍,因此您可以通過假設每個字母值始終映射到2位來解決此問題。 – 2013-04-30 02:50:44
您是否需要能夠將新密鑰追溯到原始密鑰?我建議你只需在目標系統中將alpha密鑰存儲爲額外字段並使用身份來生成目標系統密鑰。如果您要導入大量數據,那麼使用字母數字代碼計算唯一密鑰可能會妨礙性能。如果您確實希望沿着這條路線繼續前進,那麼請將您的源密鑰視爲需要轉換爲基本10號碼的基本36號碼。儘管如此,仍然沒有內置到SQL來爲你做。 – 2013-04-30 02:44:11
當構建數據倉庫(合併不同的系統)時,這個問題經常遇到並且被克服,並且使用代理鍵克服了這個問題 - 忘記了複雜的轉換,只是給它一個新的密鑰並記住舊密鑰以供參考。 – 2013-04-30 02:45:27
您是否有特定的固定尺寸,例如在32位'int'?使用'varbinary'可以讓你處理一個字母數字的二進制數據。 – HABO 2013-04-30 03:08:23