【问题标题】:Oracle (SQL Statements) - Using CASE with WHERE CLAUSEOracle(SQL 语句)- 将 CASE 与 WHERE CLAUSE 结合使用
【发布时间】:2020-04-07 14:35:45
【问题描述】:

尊敬的专家, 我准备了一个 SQL 报告,以使用 CASE 显示带有 Format_Check 验证的数据。我在下面提供了示例、问题和期望:

表结构:enter image description here

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 输出: enter image description here

SQL 输出说明:

  1. 检查 COMMENTS 列是否为 35 个字符长,还检查格式数字和空格。 SUBSTR(COMMENTS,1,35)=REGEXP_SUBSTR (评论,'(\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)

  2. 检查第一个空格后的 cmets 是否为 8 个字符长 LENGTH(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 2)))=8

  3. 检查前 8 个字符是数字/数字。 REGEXP_LIKE(TRIM(REGEXP_SUBSTR (COMMENTS, '(\S*)(\s)', 1, 1)),'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)')

预期:

我只需要在执行 SQL 时显示“格式不正确”的 cmets,我不希望看到“正确格式”的 cmets。但是,我需要您就这种情况是否与 WHERE 子句一起使用以仅显示不正确的格式 COMMENTS 提出建议。 我参考了以前与 WHERE 和 CASE 相关的查询,但是我无法弄清楚如何在 WHERE 子句中传递我的案例。 感谢您的帮助。

【问题讨论】:

    标签: sql oracle case where-clause


    【解决方案1】:

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

    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');
    

    此外,我相信正则表达式可以简化。如果您有兴趣,请提供更多详细信息...

    【讨论】:

      【解决方案2】:

      如果您根本不希望在结果中看到正确的格式,那么您可以省略select 子句中的格式计算。而是在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'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多