У меня 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
Если префикс равен нулю, а ext не равен нулю -> 1234567.890 и наоборот
Что вы хотите сделать, если один из них имеет значение NULL, а другой - нет?
Вы уверены, что они равны нулю? Может они просто пустые? в этом случае coalesce(SPRTELE_PHONE_AREA ,'') <> '' может быть тем, что вам нужно.
Похоже, у вас есть три варианта в порядке убывания, если какой-либо из них равен нулю, пропустите это. Прекрасная возможность для COALESCE (шаг 1, шаг 2, шаг 3, '')
Вот ваш дубликат: stackoverflow.com/questions/2916791/…


Как насчет этого:
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 принимает первое ненулевое значение.
разве ты не этого хочешь?
я отредактировал свой пост с примером того, как я хочу, чтобы результат был
@mecnism снова обновлен. Вы сможете взять это отсюда
Большое Вам спасибо
В вашем запросе отсутствуют 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 без пробелов, если вы объединяете возврат каретки + перевод строки для вывода многострочного адреса.
Образцы данных и желаемые результаты сотворили бы чудеса, сообщив, что вы хотите делать.