SQL- 用于检查字段是否包含字母数字字符的正则表达式
SQL- Regex to check if fields have alphanumeric characters
我正在尝试将 RegEx 用于 case 语句,以检查列是否以字母数字字符开头。下面的代码不起作用。
如果 Customer 或 Vendor 列中有字母数字字符,则 TYPE 列设置为 'Internal'。如果两列只有数字,则类型为 'External'
+----------+----------+----------+
| 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 |
您实际上不需要单独检查数字和字母:因为您声明
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
当然,我想知道你为什么 table 按照你的方式设置:你不应该将供应商和客户存储在单独的 table 中吗?
你只需要一个表达式'[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]
如果 Customer 和 Vendor 有不同的模式(比如只有客户编号,而供应商会有带有一些序列号的供应商名称),那么您需要将条件分开,而不是将它们合并在一个条件中。
我正在尝试将 RegEx 用于 case 语句,以检查列是否以字母数字字符开头。下面的代码不起作用。
如果 Customer 或 Vendor 列中有字母数字字符,则 TYPE 列设置为 'Internal'。如果两列只有数字,则类型为 'External'
+----------+----------+----------+
| 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 |
您实际上不需要单独检查数字和字母:因为您声明
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
当然,我想知道你为什么 table 按照你的方式设置:你不应该将供应商和客户存储在单独的 table 中吗?
你只需要一个表达式'[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]
如果 Customer 和 Vendor 有不同的模式(比如只有客户编号,而供应商会有带有一些序列号的供应商名称),那么您需要将条件分开,而不是将它们合并在一个条件中。