SQL-正则表达式,用于检查字段是否具有字母数字字符



我正在尝试将正则表达式用于案例语句,以检查列是否以字母数字字符开头。下面的代码不起作用。

如果"客户"或"供应商"列包含字母数字字符,则"类型"列设置为"内部"。如果两列只有数字,则类型为"外部">

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

如果客户和供应商具有不同的模式(例如,仅限客户编号,供应商名称具有一些序列号(,则需要将条件分开,而不是将它们合并到一个条件中。

相关内容

  • 没有找到相关文章

最新更新