Я пытаюсь использовать RegEx для оператора case, чтобы проверить, начинается ли столбец с буквенно-цифровых символов или нет. Приведенный ниже код не работает.
Если столбец «Клиент» или «Поставщик» содержит буквенно-цифровые символы, столбец ТИП устанавливается как «Внутренний». Если в двух столбцах есть только числа, введите «Внешний».
+----------+----------+----------+
| Customer | Vendor | TYPE |
+----------+----------+----------+
| 0488859 | | External |
+----------+----------+----------+
| P3849500 | | Internal |
+----------+----------+----------+
| | 58384899 | External |
+----------+----------+----------+
| | P3902034 | Internal |
+----------+----------+----------+
| | | NULL |
+----------+----------+----------+
Код
CASE
WHEN Customer LIKE '%[A-Z]%' OR Vendor LIKE '%[A-Z]%' THEN 'INTERNAL'
WHEN Customer LIKE '%[^0-9]%' OR Vendor LIKE '%[^0-9]%' THEN 'EXTERNAL'
ELSE 'NULL'
END AS TYPE
Вам нужно использовать Regex? Кажется, что Is_Numeric () здесь тоже подойдет.
SQL Server и SAP Hana - две очень разные системы баз данных. Какой из них вы на самом деле используете?
[^0-9]
означает регулярное выражение без номера.
используйте [0-9]
вместо [^0-9]
CREATE TABLE T (
Customer VARCHAR(50),
Vendor VARCHAR(50)
);
insert into t values ('0488859','');
insert into t values ('P3849500','');
insert into t values ('','0488859');
insert into t values ('','P3902034');
insert into t values ('','');
Запрос 1:
SELECT *, CASE
WHEN Customer LIKE '%[A-Z]%' OR Vendor LIKE '%[A-Z]%' THEN 'INTERNAL'
WHEN Customer LIKE '%[0-9]%' OR Vendor LIKE '%[0-9]%' THEN 'EXTERNAL'
ELSE 'NULL'
END AS TYPE
FROM T
| Customer | Vendor | TYPE |
|----------|----------|----------|
| 0488859 | | EXTERNAL |
| P3849500 | | INTERNAL |
| | 0488859 | EXTERNAL |
| | P3902034 | INTERNAL |
| | | NULL |
По какой-то причине он дает мне null в типе столбца
По какой причине вы не могли бы дать мне образец? Потому что, похоже, он работает в sqlfiddle
На самом деле вам не нужны отдельные проверки для числовых и буквенных символов: поскольку вы указываете
If the two columns have only numbers then type is 'External'
С тестовыми данными:
WITH CustomerVendors(Customer, Vendor) as (
SELECT '0488859', null
UNION ALL SELECT 'P3849500', null
UNION ALL SELECT NULL, '58384899'
UNION ALL SELECT NULL, 'P3902034'
)
Вам просто нужно проверить, есть ли в полях буква. Итак, ваш запрос становится:
SELECT *,
CASE
WHEN Customer LIKE '%[A-Z]%' THEN 'Internal'
WHEN Vendor LIKE '%[A-Z]%' THEN 'Internal'
ELSE 'External'
END [TYPE]
FROM CustomerVendors
Что дает вам:
Customer Vendor Type
0488859 NULL External
P3849500 NULL Internal
NULL 58384899 External
NULL P3902034 Internal
Конечно, мне интересно, почему у вас есть таблица, настроенная именно так: не следует ли хранить поставщиков и клиентов в отдельной таблице?
Я извлекаю два столбца из двух отдельных таблиц в один запрос
Это отдельная мысль, но почему у вас нет одного столбца в вашем запросе (например, CustomerOrVendorID
, и отдельного столбца, который идентифицирует тип объекта (заказчик или поставщик)? Это делает вашу логику для определения внутреннего и внешнего очистителя (независимо от по какой логике вы идете).
Вам просто нужно одно выражение '[0-9]%'
Это даст идентификатор клиента, который начинается с цифр. Тогда все остальное будет в вашу пользу. Как и в вашем примере, у вас есть только два условия (начинается с числа или начинается с буквы). Это можно было сделать так:
SELECT
CASE
WHEN Customer LIKE '[0-9]%' THEN 'External' ELSE 'Internal'
END [Type]
если фактические данные аналогичны приведенному в примере, и вы хотите включить и клиента, и поставщиков в одно и то же состояние, вы можете сделать что-то вроде этого:
SELECT
CASE
WHEN CASE WHEN Customer = '' THEN Vendor ELSE Customer END LIKE '[0-9]%' THEN 'External' ELSE 'Internal'
END [Type]
Если у покупателя или поставщика есть NULL, а не пустые строки, вы можете сделать это с помощью функции ISNULL
, подобной этой
SELECT
CASE
WHEN ISNULL(Customer,Vendor) LIKE '[0-9]%' THEN 'External' ELSE 'Internal'
END [Type]
если у клиента и поставщика разные шаблоны (скажем, номера только клиентов, а у поставщиков будет имя поставщика с некоторым порядковым номером, тогда вам необходимо разделить условия, а не объединять их в одном условии.
Разве это не должно быть
LIKE '[A-Z]%'
, если вы хотите проверить только первый символ?