оператор обращения в sybase

#sql #sybase #case-statement

#sql #sybase #оператор обращения

Вопрос:

У меня есть следующее требование для запроса Sybase:-

Исключить ниже, если:

  • SSN имеет более или менее девяти цифр
  • SSN включает в себя нечисловые символы
  • SSN является пустым
  • SSN содержит те же цифры (например, 000000000, 111111111 или 999999999)
  • SSN имеет 9 в качестве первой цифры и 7, 8 или 9 в качестве четвертой цифры
  • Четвертая и пятая цифры равны 00 (кроме 800-00-0000)
  • С шестой по девятую цифры — 0000

Я написал оператор case, как показано ниже, но он не работает, может кто-нибудь помочь, пожалуйста:

 SELECT CASE
    WHEN LEN(a.MEMBER_SSN) > 9 THEN ' '
    WHEN LEN(a.MEMBER_SSN) < 9 THEN ' '
    WHEN LTRIM(RTRIM(a.MEMBER_SSN)) like '%[A-Z,a-z]%' then ' '
    WHEN LTRIM(RTRIM(WHEN a.MEMBER_SSN)) like '%[0-9]%' then ' '
    WHEN LTRIM(RTRIM(a.MEMBER_SSN)) in ( '000000000','000000001','000000002','000000003','000000004','000000005','999999999','111111111','000000070','123456789','999999998','000000071','888888888', ) THEN ''
    WHEN LTRIM(RTRIM(a.MEMBER_SSN)) NOT LIKE '9__[789]%' THEN a.MEMBER_SSN ELSE ' '
    WHEN LTRIM(RTRIM(a.MEMBER_SSN)) NOT LIKE '____[00]%' THEN a.MEMBER_SSN ELSE ' '
    WHEN LTRIM(RTRIM(a.MEMBER_SSN)) NOT LIKE '_____[0000]%' THEN a.MEMBER_SSN ELSE ' '
    END AS SUBSCRIBER_SSN From dbo.MEMBER_TABLE a
  

Комментарии:

1. Просто чтобы быть точным: это выражение CASE, а не оператор CASE. Это две разные вещи.

2. В качестве примечания: вы упоминаете SSN 800-00-0000, который должен быть сохранен как ‘800000000’, чтобы соответствовать критериям. Если это не так, и вы хотите разрешить SSN с тире или тому подобное, вы можете захотеть манипулировать SSN перед его проверкой (например regexp_replace (a.member_ssn, '[^[:digit:]]', '') ).

Ответ №1:

Вот более короткая версия:

 SELECT (CASE WHEN LEN(a.MEMBER_SSN) <> 9 THEN ' '
             WHEN a.MEMBER_SSN LIKE '%[^0-9]%' THEN ' '
             WHEN REPLACE(a.MEMBER_SSN, LEFT(a.MEMBER_SSN, 1), '') = '' THEN ' '
             WHEN a.MEMBER_SSN LIKE '9__[789]%' THEN ' '
             WHEN a.MEMBER_SSN LIKE '___00%' AND a.MEMBER_SSN <> '800-00-0000' THEN ' '
             WHEN a.MEMBER_SSN LIKE '00' THEN ' '
             ELSE a.MEMBER_SSN
        END) AS SUBSCRIBER_SSN
From dbo.MEMBER_TABLE a
  

Это почти прямая транскрипция ваших условий.

Ответ №2:

Первая проблема — синтаксическая ошибка. Может быть только один ELSE на CASE :

 CASE
  WHEN ... THEN ...
  WHEN ... THEN ...
  WHEN ... THEN ... ELSE ... -- this ELSE doesn't belong here
  WHEN ... THEN ... ELSE ... -- and this ELSE should go to the next line for readability
END      
  

Затем вы хотите выбрать SSN, когда ни одно из условий отклонения не выполнено (NOT … И НЕ …), но

 WHEN LTRIM(RTRIM(a.MEMBER_SSN)) NOT LIKE '9__[789]%' THEN a.MEMBER_SSN
  

выбрал бы SSN независимо от следующих условий.

Вот один из вариантов написания условий с использованием AND и OR :

 WHEN TRIM(a.member_ssn) = '800000000'
OR
(
  TRIM(a.member_ssn) LIKE '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
  AND
  TRIM(a.member_ssn) NOT LIKE '___00%'
  AND
  TRIM(a.member_ssn) NOT LIKE '00'
  AND
  TRIM(a.member_ssn) NOT LIKE '9__[789]%'
  AND
  TRIM(a.member_ssn) NOT IN ('000000000', '111111111', ... '999999999')
) THEN TRIM(a.member_ssn)
  ELSE ' '
END AS subscriber_ssn