#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, похоже, также не поддерживает регулярные выражения …)