Лучший способ проверить SQL логи c ворота - PullRequest
0 голосов
/ 06 февраля 2020

Я хотел проверить несколько логических c вентилей, которые я написал для запроса. Рад, что я сделал, потому что я написал код в конце дня, и это оказалось относительно очевидной ошибкой.

Я хочу знать, есть ли способ сделать код чище или просто выглядеть лучше. Я думаю, что 2 области, которые могли бы использовать улучшения:

  • Как я выбираю результаты. Прямо сейчас это оператор case, который возвращает 1 или 0, но есть способ просто написать что-то вроде select (x and y)
  • Как я генерирую истинные / ложные перестановки. Я подумал о том, чтобы заполнить одну временную таблицу с помощью 1/0 и повторно использовать ее с псевдонимами, но это не слишком сильно очищает.
select x, y, z, case when (x=1 and y=1 or z=1) then 1 else 0 end as ResultOne, case when (x=1 and (y=1 or z=1)) then 1 else 0 end as ResultTwo
from 
(   select 1 x
    union
    select 0 x
) as A
inner join
(   select 1 y
    union
    select 0 y
) as B on 1=1
inner join
(   select 1 z
    union
    select 0 z
) as C on 1=1
order by x,y,z

Query result set

Ответы [ 2 ]

0 голосов
/ 09 февраля 2020

Без табличных конструкторов, с некоторой математикой.

select a.x
      ,b.y
      ,c.z
      ,case when (a.x + b.y = 2 or c.z = 1) then 1 else 0 end ResultOne
      ,case when (a.x = 1 and b.y + c.z >= 1) then 1 else 0 end ResultTwo
from (select 1 x union select 0) a
cross join (select 1 y union select 0) b
cross join (select 1 z union select 0) c;
0 голосов
/ 06 февраля 2020

Вы можете легко использовать табличные конструкторы для чего-то подобного. Гораздо проще, чем все эти присоединения к подзапросам. Хотя с таким небольшим количеством данных я не думаю, что это имеет большое значение. И используйте перекрестное соединение вместо 1 = 1. Вот для чего они нужны.

select a.x
    , b.y
    , c.z
    , case when (a.x = 1 and b.y = 1 or c.z = 1) then 1 else 0 end as ResultOne
    , case when (a.x = 1 and (b.y = 1 or c.z = 1)) then 1 else 0 end as ResultTwo
from (values(0),(1)) a(x)
cross join (values(0),(1)) b(y)
cross join (values(0),(1)) c(z)
...