我正在尝试将正则表达式用于案例语句,以检查列是否以字母数字字符开头。下面的代码不起作用。
如果"客户"或"供应商"列包含字母数字字符,则"类型"列设置为"内部"。如果两列只有数字,则类型为"外部">
+----------+----------+----------+
| 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
[^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 |
您实际上不需要单独检查数字和字母: 既然你声明
如果两列只有数字,则类型为"外部">
使用测试数据:
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
当然,我想知道为什么你有一个表格设置你的方式:你不应该将供应商和客户存储在一个单独的表中吗?
你只需要一个表达式'[0-9]%'
这将获得以数字开头的客户 ID。那么其余的将对您有利。从您的示例中,您只有两个条件(以数字开头或以字母开头(。这可以像这样完成:
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]
如果客户和供应商具有不同的模式(例如,仅限客户编号,供应商名称具有一些序列号(,则需要将条件分开,而不是将它们合并到一个条件中。