SQL Server: значения concat

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

Я создал случай, когда я хочу отображать только SPRTELE_PHONE_NUMBER, если значения SPRTELE_PHONE_AREA и SPRTELE_PHONE_EXT равны нулю. В противном случае, если они не равны нулю, на выходе будет «(префикс) 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, доб = 890

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

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

Образцы данных и желаемые результаты сотворили бы чудеса, сообщив, что вы хотите делать.

Gordon Linoff 13.12.2018 20:54

Что вы хотите сделать, если один из них имеет значение NULL, а другой - нет?

Tab Alleman 13.12.2018 20:57

Вы уверены, что они равны нулю? Может они просто пустые? в этом случае coalesce(SPRTELE_PHONE_AREA ,'') <> '' может быть тем, что вам нужно.

Dale K 13.12.2018 20:57

Похоже, у вас есть три варианта в порядке убывания, если какой-либо из них равен нулю, пропустите это. Прекрасная возможность для COALESCE (шаг 1, шаг 2, шаг 3, '')

KeithL 13.12.2018 21:07

Вот ваш дубликат: stackoverflow.com/questions/2916791/…

Tab Alleman 13.12.2018 21:27
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
80
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

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

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 принимает первое ненулевое значение.

разве ты не этого хочешь?

KeithL 13.12.2018 21:16

я отредактировал свой пост с примером того, как я хочу, чтобы результат был

mecnism 13.12.2018 21:17

@mecnism снова обновлен. Вы сможете взять это отсюда

KeithL 13.12.2018 21:21

Большое Вам спасибо

mecnism 13.12.2018 21:25
Ответ принят как подходящий

В вашем запросе отсутствуют 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;

Ну вот

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        |
+-----------+

Ключевым моментом здесь является объединение символов формата (скобки и точки) со значением поля внутри функции 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 без пробелов, если вы объединяете возврат каретки + перевод строки для вывода многострочного адреса.

Другие вопросы по теме