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

Results:

| 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 有不同的模式(比如只有客户编号,而供应商会有带有一些序列号的供应商名称),那么您需要将条件分开,而不是将它们合并在一个条件中。