Обновить запрос - T SQL - PullRequest
       21

Обновить запрос - T SQL

2 голосов
/ 20 июня 2019

SQL Server: версия 2008 R2

Мне нужен запрос t-sql для удаления кода страны со всех телефонных номеров с префиксным кодом, например, если номер телефона 8522345678901 для Гонконга, я хочу удалить852, и результат должен быть 2345678901. Нижеприведенные таблицы приведены ниже, а соединительный столбец - это код страны, т.е. HK, США, Великобритания, AUS, поэтому на основе кода страны мне нужно обрезать префикс DialingPhoneCode из столбцов таблицы PhoneNumbers, т. Е. Мобильный, факс,стационарный.

Пример данных для телефонных номеров

Mobile     , Fax,        Landline,   CountryCode

61298765432, 228765432  , 598765432,  AUS
61298765432, 61228765432, 598765432,  AUS
85228157711, 28157711   , 85228157711,HK

Пример данных для телефонных кодов

DialingPhoneCode, CountryCode

61 ,             AUS
851,             HK

Ожидаемый вывод для телефонных номеров

Mobile,Fax, Landline, CountryCode

298765432, 228765432, 598765432, AUS
298765432, 228765432, 598765432, AUS
28157711 , 28157711 , 28157711 , HK

Microsoft T-SQL

CREATE TABLE [dbo].[PhoneNumbers](
    [Mobile] [varchar](500) NULL,
    [Fax] [varchar](500) NULL,
    [Landline] [varchar](500) NULL,
    [CountryCode] [varchar](500)  NULL
) ON [PRIMARY]

GO


CREATE TABLE [dbo].[PhoneCodes](
    [DialingPhoneCode] [varchar](500) NULL,
    [CountryCode] [varchar](500)  NULL
) ON [PRIMARY]

GO

1 Ответ

1 голос
/ 21 июня 2019

Вы можете попробовать это:

SELECT 
    IIF(B.MOBILECODE = DialingPhoneCode, RIGHT(B.MOBILE, LEN(B.MOBILE)-B.CODELENGTH), B.MOBILE) AS UPDATEDMOBILE,
    IIF(B.FAXCODE = DialingPhoneCode, RIGHT(B.FAX, LEN(B.FAX)-B.CODELENGTH), B.FAX) AS UPDATEDFAX,
    IIF(B.LANDLINECODE = DialingPhoneCode, RIGHT(B.LANDLINE, LEN(B.LANDLINE)-B.CODELENGTH), B.LANDLINE) AS UPDATEDLANDLINE,
    B.COUNTRYCODE
FROM (
SELECT A.MOBILE, A.FAX, A.LANDLINE, A.COUNTRYCODE, A.DialingPhoneCode,A.CODELENGTH
,LEFT(A.MOBILE, A.CODELENGTH) AS MOBILECODE
,LEFT(A.Fax, A.CODELENGTH) AS FAXCODE
,LEFT(A.Landline, A.CODELENGTH) AS LANDLINECODE
FROM (
SELECT P1.Mobile,P1.Fax,P1.Landline,P1.CountryCode, P2.DialingPhoneCode
, LEN(P2.DialingPhoneCode) AS CODELENGTH
FROM PhoneNumbers P1
LEFT JOIN PhoneCodes P2
ON P1.CountryCode = P2.CountryCode)A )B 

Функция IIF может использоваться только в SQL Server 2012 или более поздней версии.

Если вы используете более старую версию, вы можете использоватьоператор case для их замены.


Результат теста (я добавил еще два образца теста):

DB <> Fiddle

---- Обновление ----

Добавить Обновление и регистр операторов:

UPDATE PhoneNumbers
SET Mobile = C.UPDATEDMOBILE,
    Fax = C.UPDATEDFAX,
    Landline = C.UPDATEDLANDLINE
FROM
(
SELECT 
CASE WHEN B.Mobile IS NULL THEN NULL
     WHEN B.MOBILE IS NOT NULL AND B.MOBILECODE = DialingPhoneCode THEN RIGHT(B.MOBILE, LEN(B.MOBILE)-B.CODELENGTH) 
     ELSE B.MOBILE END AS UPDATEDMOBILE,
CASE WHEN B.Fax IS NULL THEN NULL
     WHEN B.FAXCODE = DialingPhoneCode THEN RIGHT(B.FAX, LEN(B.FAX)-B.CODELENGTH) 
     ELSE B.FAX END AS UPDATEDFAX,
CASE WHEN B.Landline IS NULL THEN NULL
     WHEN B.LANDLINECODE = DialingPhoneCode THEN RIGHT(B.LANDLINE, LEN(B.LANDLINE)-B.CODELENGTH) 
     ELSE B.LANDLINE END AS UPDATEDLANDLINE,
    B.COUNTRYCODE, B.Mobile, B.Fax, B.Landline
FROM (
SELECT A.MOBILE, A.FAX, A.LANDLINE, A.COUNTRYCODE, A.DialingPhoneCode,A.CODELENGTH
,LEFT(A.MOBILE, A.CODELENGTH) AS MOBILECODE
,LEFT(A.Fax, A.CODELENGTH) AS FAXCODE
,LEFT(A.Landline, A.CODELENGTH) AS LANDLINECODE
FROM (
SELECT P1.Mobile,P1.Fax,P1.Landline,P1.CountryCode, P2.DialingPhoneCode
, LEN(P2.DialingPhoneCode) AS CODELENGTH
FROM PhoneNumbers P1
LEFT JOIN PhoneCodes P2
ON P1.CountryCode = P2.CountryCode)A )B )C
WHERE   C.Mobile = PhoneNumbers.Mobile 
    AND C.Fax = PhoneNumbers.Fax
    AND C.Landline = PhoneNumbers.Landline

Результат теста:

DB <>Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...