Oracle(SQL语句)-使用WHERE子句的CASE

Oracle(SQL语句)-使用WHERE子句的CASE,sql,oracle,case,where-clause,Sql,Oracle,Case,Where Clause,各位专家:, 我正在准备一个SQL报告,以使用CASE检查验证的格式显示数据。我提供了以下示例、问题和期望: 表格结构: SELECT ID,PRODUCT,COMMENTS CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\

各位专家:, 我正在准备一个SQL报告,以使用CASE检查验证的格式显示数据。我提供了以下示例、问题和期望:

表格结构:

SELECT 

ID,PRODUCT,COMMENTS

CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
AND
LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
AND
REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
THEN 'Correct Format'
ELSE 'Incorrect_Format'
END AS Format_Check

FROM TEST_TABLE
SQL语句:

SELECT 

ID,PRODUCT,COMMENTS

CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
AND
LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
AND
REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
THEN 'Correct Format'
ELSE 'Incorrect_Format'
END AS Format_Check

FROM TEST_TABLE
SQL输出:

SQL输出说明:

SELECT 

ID,PRODUCT,COMMENTS

CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
AND
LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
AND
REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
THEN 'Correct Format'
ELSE 'Incorrect_Format'
END AS Format_Check

FROM TEST_TABLE
  • 检查注释列是否为35个字符长,还检查格式编号和空格。SUBSTR(注释,1,35)=REGEXP\u SUBSTR 注释,(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)1)

  • 检查第一个空格后的注释长度是否为8个字符(TRIM(REGEXP_SUBSTR(注释,(\S*)(\S*),1,2))=8

  • 检查前8个字符是否为数字/数字。REGEXP_LIKE(TRIM(REGEXP_SUBSTR)(注释,(\S*)(\S)),1, 1) ),“(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)”)

  • 期望值:

    SELECT 
    
    ID,PRODUCT,COMMENTS
    
    CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
    AND
    LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
    AND
    REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
    THEN 'Correct Format'
    ELSE 'Incorrect_Format'
    END AS Format_Check
    
    FROM TEST_TABLE
    
    我只需要在执行SQL时显示“格式不正确”的注释,我不希望看到“格式正确”的注释。但是,我需要您的建议,说明这个案例是否与WHERE子句一起使用,以便仅显示不正确的格式注释。 我提到了以前有关WHERE和CASE的查询,但是我不知道如何在WHERE子句中传递我的CASE。
    谢谢您的帮助。

    如果您根本不希望在结果中看到正确的格式,那么您可以在
    选择
    子句中省略格式的计算。而是在
    Where
    子句中使用它,如下所示:

    SELECT ID,
           PRODUCT,
           COMMENTS,
          'Incorrect_Format' AS format_check
      FROM TEST_TABLE
     WHERE CASE WHEN SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (COMMENTS,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\s)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)',1,1)
    AND
    LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8 
    AND
    REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')
    THEN 'Correct Format'
    ELSE 'Incorrect_Format'
    END AS = 'Incorrect_Format'
    

    如果要显示格式不正确的列,可以使用另一个列包装查询:

    SELECT id, product, comment, format_check
      FROM (
            SELECT id, product, comment, CASE WHEN .... END AS format_check
              FROM test_table
           )
     WHERE format_check = 'Incorrect_Format';
    
    顺便说一句,如果使用SQL而不是图像显示表和数据,您的问题更容易回答,例如:

    CREATE TABLE test_table (id NUMBER, product VARCHAR2(10), comments VARCHAR2(50));
    INSERT INTO  test_table VALUES (1,'Laptop', '00000001 01012020 02022020 03032020');
    INSERT INTO  test_table VALUES (1,'PC',     '   00000001 01012020 02022020 0034');
    
    此外,我相信正则表达式可以简化。请提供更多的细节,如果你有兴趣