Можем ли мы иметь несколько операторов case then в sql

#sql #case #teradata

#sql #case #teradata

Вопрос:

Я пытаюсь сделать что-то, что требует случая в случае, я просто хотел убедиться, можем ли мы использовать несколько случаев?Я запускаю это на sql teradata Код, который я пытаюсь использовать, выглядит следующим образом

 AND(
    case when CHARACTER_LENGTH(drug.n)=0 then 0 

     when CHARACTER_LENGTH(drug.n)=1 then
     (case when substring(drug.n from  1,1) in            (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end)


     when CHARACTER_LENGTH(drug.n)=2 then 
     (case when substring(drug.n from  1,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end *
     case when substring(drug.n from  2,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end ) 


     when CHARACTER_LENGTH(drug.n)=3 then 
     (case when substring(drug.n from  1,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end *
     case when substring(drug.n from  2,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end *
     case when substring(drug.n from  3,1) in (''0'',''1'',''2'',''3'',''4'',''5'',''6'',''7'',''8'',''9'') then 1 else 0 end )=1
  

Если у кого-то есть идея получше, вы можете дать мне знать. Я не могу использовать isnumeric функцию.

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

1. Ммм … вы имеете ('0','1','2',...etc) в виду, а не (''0'',''1'',...etc) , верно?

2. Не могли бы вы подробнее рассказать, почему вы хотите сделать это так / чего вы пытаетесь достичь и т.д.?

3. Кроме того, не было бы проще просто проверить с помощью регулярного выражения ( case when substring(drug.n from 1,1)~'[0-9]' … и т.д.)?

4. В teradata 12 не определено regexpr, и это моя СУБД, над которой я работаю. Я не могу определить какие-либо UDF, поскольку у меня нет прав доступа. Я пробовал сам, но его завершение занимает очень много времени, поэтому просто хотел убедиться, правильный ли мой синтаксис или нет. Что я пытаюсь здесь сделать, так это то, что я проверяю, содержит ли ячейка в столбце drug.n 0 элементов, и если да, возвращает 1, если в нем есть 1 элемент, он проверяет, является ли это числом, и если оно возвращает 1, то 0 аналогично для остальных. Я знаю, что этот логический способ выглядит впечатляюще, но у меня очень мало опций в teradata для замены функций типа regexpr

5. Я пытаюсь найти, могу ли я иметь блок case в операторе then? Это правильно, потому что я проверил это в Интернете, и я не вижу ни одного такого примера..

Ответ №1:

Да, вы можете использовать вложенные CASE операторы. Никаких проблем с этим в Teradata

Ответ №2:

Хорошо —
Чтобы определить, содержит ли строка произвольной длины только числовые символы (или нет), вы можете использовать рекурсивный CTE .

Пожалуйста, обратите внимание, что я не знаю, действительно ли ваша СУБД поддерживает рекурсивные CTE, но это потенциальное решение. Кроме того, я не уверен в последствиях для производительности — однако это устраняет множественный CASE эффект (и почему это не фактическое числовое поле, в любом случае?).

Итак… Для таблицы, которая выглядит следующим образом:

 id   ch
================
1   1234567890
2   asdg      
  

Этот оператор возвращает все строки, содержащие только числовые символы (любой длины):

 WITH splitstring (id, chard, start, orig) as (
                  SELECT id, SUBSTRING(ch, 1, 1), 1, ch
                  FROM chartable
                  UNION ALL
                  SELECT id, SUBSTRING(orig, start   1, 1), start   1, orig
                  FROM splitstring
                  WHERE LENGTH(orig) > start)
SELECT * 
FROM chartest as a
WHERE NOT EXISTS (SELECT '1'
                  FROM splitstring as b
                  WHERE a.id = b.id
                  AND chard NOT BETWEEN '0' AND '9')
  

Без некоторого более широкого контекста довольно сложно точно знать, чего вы пытаетесь достичь. Однако это должно быть адаптировано к вашим потребностям.

(В качестве примечания, DB2 для iSeries, похоже, также не поддерживает регулярные выражения …)