В SQL (Tsql) хороший способ проверить взаимоисключающие параметры верны - PullRequest
1 голос
/ 21 марта 2012

РЕДАКТИРОВАТЬ: Дэмиен неверующий, мои извинения, пытаясь быть кратким, я пропустил, говоря, что дизайн таблицы не под моим контролем; эта таблица представляет собой «дамп» данных, которые мы получаем от другого поставщика, и мне нужно преобразовать их из нашего формата в наш. Причина, по которой мне нужен запрос, состоит в том, чтобы выяснить, соответствуют ли данные предположениям в других частях кода. Предлагаемые решения для поиска длины или точного соответствия объединенных строк лучше, чем моя пара запросов для описанной мной проблемы.

У меня есть рабочая пара запросов для моей проблемы, но мне было интересно, есть ли что-то более красивое. Точно один из taxidflag1, taxidflag2, taxidflag3 должен быть заполнен * в каждом ряду. Поэтому я подтверждаю, что у них у всех два бланка и один *, как это. Все поля не обнуляются.

select * from acct where 2 <>
(case when taxidFlag1 <> '' then 1 else 0 end) + 
(case when taxidFlag2 <> '' then 1 else 0 end) +
(case when taxidFlag3 <> '' then 1 else 0 end) 

select * from acct where 1 <>
(case when taxidFlag1 = '*' then 1 else 0 end) + 
(case when taxidFlag2 = '*' then 1 else 0 end) +
(case when taxidFlag3 = '*' then 1 else 0 end) 

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Вы можете сделать это:

select * from acct where taxidFlag1 + taxidFlag2 + taxidFlag3 = '*';

Это условие выполняется только в том случае, если два пустых ('') и одно - звездочка (*).

1 голос
/ 21 марта 2012
select *
from
  acct a1
where
  (select count(*) from acct unpivot (foo for taxidFlag in (taxidFlag1, taxidFlag2, taxidFlag3)) as unp where unp.row_id = a1.row_id and foo = '*') <> 1
;

, где row_id - ваше поле первичного ключа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...