2017-09-13 46 views
1

當我運行:領先的數字

select * from jfi.ambitiontempdata limit 2000; 

我的結果集是正確的,但我有電話號碼的問題。在我的called_partycalling_party字段中的一些數字是4位數的擴展名,這很好,有些數字是正常的10位數字,這也很好,但有些數字有前導'1'或其他數字。

有沒有辦法在這個表上運行查詢來說if calling_party or called_party are 11 digits, remove leading digit

UPDATE:

這是我當前查詢到在一個表匹配的電話號碼,另一個

SELECT ua.*, u.firstn, u.lastn, u.Extension 
FROM 
(select a.* FROM jfi.ambitiontempdata a 
inner join jfi.ambition_customer_data c on a.called_party = c.phone 
where a.outbound = 1 
UNION 
select a.* FROM jfi.ambitiontempdata a 
inner join jfi.ambition_customer_data c on a.calling_party = c.phone 
where a.outbound = 0) ua 
INNER JOIN jackson_id.users u 
on ua.Extension = u.Extension; 

jfi.ambitiontempdata電話號碼有幾個電話號碼,called_pa​​rty和calling_party是標準的10位數字,但有些有領先的'1',但是,我的ambition_customer_data中的所有數字都有10位數字。

+0

使用案例來評估長度,如果11然後採取正確的10個字符。儘管注意1是國家代碼(美國+加拿大)。如果您從美國境外撥打電話,您可能需要超過10位數字。如果您打電話給我們到另一個國家,您需要超過11個。 – xQbert

+0

添加一些示例表格數據和預期結果 - 作爲格式化文本,而不是圖像。 – jarlh

回答

2

更新了答案,解決問題的更新:
你可以抓住的最右邊的10位的字符串(這隻會返回4位,如果只有4個)。我將假設你的電話號碼字段是(var)char字段,而不是bigint。如果它們存儲在bigint字段中,那麼在將它們作爲字符串操作之前,需要將它們轉換爲char。

您可以使用RIGHT函數來執行此操作。

SELECT ua.*, u.firstn, u.lastn, u.Extension 
FROM 
(select a.* FROM jfi.ambitiontempdata a 
inner join jfi.ambition_customer_data c on right(a.called_party, 10) = c.phone 
where a.outbound = 1 
UNION 
select a.* FROM jfi.ambitiontempdata a 
inner join jfi.ambition_customer_data c on right(a.calling_party, 10) = c.phone 
where a.outbound = 0) ua 
INNER JOIN jackson_id.users u 
on ua.Extension = u.Extension; 

警告:通過函數運行* _party列將阻止優化器在這些列上使用索引。因此,隨着您的ampitiontemp數據表的增長,性能會下降。

理想情況下,您應該將相同的電話號碼存儲在您的ampition_customer_data表中,或者在您的ambitiontempdata表中有單獨的10個字符的列。另一種解決方案可能是使用電話號碼和ID分開表格,然後只在表格中引用該ID,而不是完整的電話號碼。

+0

道歉,當你加入這個時,我正在更新我的問題。我理解這種方法,但是我能否將它結合到我剛剛發佈的更新中的現有查詢中?基本上剝離我的ambitiontempdata表中的數字,然後匹配到另一個表中的主角? –

+0

並且爲了確認,您的select語句完美地工作,就像我現有的查詢一樣,我只需要將它們以某種方式組合起來 –

+0

@TomN。你只需要替換'a。被調用的第一個查詢中的第一個查詢名爲'called_pa​​rty',其中'right(convert(called_pa​​rty,char(11)),10)'和類似的用於union中的第二個select .'on a.calling_party''with right (convert(calling_party,char(11)),10)'但是這會使索引的使用無效。所以在一張大桌子上表現出較慢的表現;但它應該工作。 – xQbert

1
SELECT RIGHT(calling_party, LEN(calling_party) - 1) AS calling_party_trimmed 
SELECT RIGHT(called_party, LEN(called_party) - 1) AS called_party_trimmed 

借用其他人的解釋是:爲了解釋,RIGHT需要兩個參數 - 字符串(或列)來操作,並且字符數返回(字符串的「右」側開始) 。 LEN返回列數據的長度,我們減去一個,這樣我們的RIGHT函數就會將最左邊的字符放在「後面」。

+0

好的方法,但它有點錯過了這個問題。這只是簡單地刪除第一個字符,而不是將該值修剪爲10個或更少的字符。使用'LEN(calling_party)-1'而不是硬編碼長度爲「10」的危險是它假設列值總是11個字符長。國家代碼可能是兩位數字,使其12個字符(例如442071234567),或者它可能是一個4位數字的擴展名。 – RToyo