2015-08-14 43 views
1

MS SQL服務器工作,我從來沒有用過PLSQL,但我最近收到的代碼行從同事(見下文):的Oracle/SQL到SQL Server翻譯

substr(Field1, 1, 8)||'*'||SUBSTR(Field1, 10, 1) 

我可以很輕鬆地處理substr - >substring位,但我失去了什麼||'*'||的意思/確實;它是串聯還是我還沒有想到的其他東西?

+1

它的串聯。 –

+1

根據上下文的不同,一個問題是Oracle將零長度的VARCHAR和NULL視爲同義詞,有時會表現爲空洞,有時不行。在Oracle中'null ||'*''產生''*'',而在SQL Server上'null +'*''將產生'null'。根據子字符串返回null的機會,您可能會在'coalesce(substring(...),'')'中包裝以在SQL Server上獲得類似的行爲。 –

+0

你的問題中沒有PL/SQL代碼。 –

回答

1

Oracle中的||運算符(以及@a_horse_with_no_name註釋 - 標準ANSI)SQL確實是字符串之間的concatination運算符。在MS SQL Server的SQL中,您只需使用+。所以翻譯是:

SUBSTRING(Field1, 1, 8) + '*' + SUBSTRING(Field1, 10, 1) 
+0

謝謝,Mureinik! – eddymc2

+0

@ eddymc2:它實際上不是「Oracle的」串聯運算符。 '||'是在SQL標準中定義的運算符。 –

+0

我的印象是「+」是字符串凝聚的標準SQL方式,「||」是Oracle專有的語法。今天學到了新東西。感謝@a_horse_with_no_name。 – Mureinik

1

就像@MarcB說這是串聯,|| {string here} ||相當於+concat()在SQL Server:

substring(Field1, 1, 8)+ '*' + substring(Field1, 10, 1) 
+1

謝謝,FutbolFan!祝你好運! – eddymc2

+0

@ eddymc2哈哈,謝謝兄弟! – FutbolFan

0

連接兩個字符串的結果是另一個字符 字符串。如果兩個字符串的數據類型都是CHAR,則結果爲 數據類型爲CHAR,並且限制爲2000個字符。如果任一字符串是數據類型爲VARCHAR2的 ,則結果具有數據類型VARCHAR2,並且將 限制爲4000個字符。如果其中一個參數是CLOB,則結果是一個 臨時CLOB。無論字符串或CLOB的數據類型如何,字符串中的尾隨空白均由 級聯保留。

在大多數平臺上,連接運算符是兩個實心垂直 條,如表4-3所示。但是,某些IBM平臺爲此操作員使用了斷開的 豎條。當在具有不同字符集的系統(例如ASCII和 EBCDIC)之間移動 系統之間的SQL腳本文件時,豎線可能不會被轉換爲目標Oracle數據庫環境所需的豎線 。 Oracle提供 CONCAT字符函數作爲豎線 操作符的替代方法,用於操作系統或網絡實用程序難以或不可能控制 轉換時的情況。在應用程序中使用 此功能將在具有不同字符集的環境 之間移動。

儘管Oracle把零長度字符串作爲空值, 串接一個零長度字符串與另一操作數 總是導致其它操作數,所以空只能從 級聯兩個空字符串的結果。但是,在未來版本的Oracle數據庫中,這可能不會延續到 。要連接可能爲空的 表達式,請使用NVL函數明確地 將表達式轉換爲零長度字符串。

source

爲了有一個更清晰的源代碼,你可以考慮使用CONCAT

這是一個後about perfomance