SQL Server: согласованные значения - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть 3 столбца SPRTELE_PHONE_AREA, SPRTELE_PHONE_NUMBER и SPRTELE_PHONE_EXT - префикс, номер и доп.

Я создал случай, в котором я хочу отображать только SPRTELE_PHONE_NUMBER, если SPRTELE_PHONE_AREA и SPRTELE_PHONE_EXT равны нулю.Иначе, если они не равны NULL, вывод будет "(префикс) number.ext" с круглыми скобками и точкой.

Вот мой код:

SELECT
    CASE
        WHEN SPRTELE_PHONE_AREA IS NULL AND SPRTELE_PHONE_EXT IS NULL 
           THEN SPRTELE_PHONE_NUMBER
           ELSE CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
    END
FROM 
    vcc.sprtele;

Проблема в том, что выходные данные отображаются в виде второго регистра для каждой записи: "CONCAT ..."

Где находитсяпроблема здесь?

Пример: префикс = 650, число = 1234567, ext = 890

  • , если префикс и ext равны нулю -> 1234567
  • , если префикс и extне равны нулю -> (650) 1234567.890

Если префикс равен нулю, а ext не равен нулю -> 1234567.890 и наоборот

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Ключевым моментом здесь является помещение символов формата (круглые скобки и точка), соединенных со значением поля внутри функции ISNULL ():

;WITH Data AS (
    SELECT  1 AS ExampleNumber,
            '555' AS Prefix,
            '1234567' AS PhoneNumber,
            '999' AS Extension
    UNION
    SELECT  2 AS ExampleNumber,
            NULL AS Prefix,
            '1234567' AS PhoneNumber,
            '999' AS Extension
    UNION
    SELECT  3 AS ExampleNumber,
            '555' AS Prefix,
            '1234567' AS PhoneNumber,
            NULL AS Extension
)

SELECT      ISNULL('(' + d.Prefix + ')', '')
                + ISNULL(d.PhoneNumber, '')
                + ISNULL('.' + d.Extension, '')
FROM        Data d
ORDER BY    d.ExampleNumber

Результаты:

(555)1234567.999
1234567.999
(555)1234567

Этот метод также можно использовать для объединения, например, Address1, Address2 и Address3 без пробелов, если вы объединяете возврат каретки + перевод строки для многострочного вывода адреса.

0 голосов
/ 13 декабря 2018

В вашем запросе отсутствуют 2 случая: если префикс равен нулю, а ext не равен нулю и, если ext равно нулю, а префикс не равен нулю .

SELECT
  CASE
    WHEN SPRTELE_PHONE_AREA IS NULL AND SPRTELE_PHONE_EXT IS NULL THEN SPRTELE_PHONE_NUMBER
    WHEN SPRTELE_PHONE_AREA IS NULL THEN CONCAT(SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
    WHEN SPRTELE_PHONE_EXT IS NULL THEN CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER)
    ELSE CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
  END
FROM vcc.sprtele;
0 голосов
/ 13 декабря 2018

Вот, пожалуйста,

CREATE TABLE T(
  Prefix VARCHAR(20),
  Num VARCHAR(20),
  Ext VARCHAR(20)
);

INSERT INTO T VALUES
('1', '11', '111'),
(NULL, '22', '222'),
('3', '33', NULL),
(NULL, '44', NULL);

SELECT CONCAT( IIF(Prefix IS NULL, '', CONCAT('(', Prefix, ')')),
               Num,
               IIF(Ext IS NULL, '', CONCAT('.', Ext))
             ) Results
FROM T

Возвращает:

+-----------+
|  Results  |
+-----------+
| (1)11.111 |
| 22.222    |
| (3)33     |
| 44        |
+-----------+
0 голосов
/ 13 декабря 2018

Как насчет этого:

COALESCE(CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
        ,CONCAT('(', SPRTELE_PHONE_AREA, ')', SPRTELE_PHONE_NUMBER
        ,CONCAT( SPRTELE_PHONE_NUMBER, '.', SPRTELE_PHONE_EXT)
        ,SPRTELE_PHONE_NUMBER,'')

COALESCE принимает первое ненулевое значение.

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