Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Переписать запрос  [new]
_human
Member

Откуда:
Сообщений: 560
Помогите переписать сей шлак, никик не соображу как переписать без CASE

SELECT *
 FROM tab_A
 LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
 LEFT JOIN tab_C ON 
	 CASE WHEN ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" 
	    THEN tab_B.col_2 = tab_C.col_3
		ELSE tab_A.col_4 = tab_C.col_3
	 END
	 AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)
22 июн 17, 17:14    [20584279]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
ISNULL тут не нужен. Достаточно tab_A.col_1 <>''
22 июн 17, 17:34    [20584336]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
_human
Помогите переписать сей шлак, никик не соображу как переписать без CASE

SELECT *
 FROM tab_A
 LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
 LEFT JOIN tab_C ON 
	 CASE WHEN ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" 
	    THEN tab_B.col_2 = tab_C.col_3
		ELSE tab_A.col_4 = tab_C.col_3
	 END
	 AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)
И это работает??
Как можно писать такое??
ON 
	 CASE WHEN ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" 
	    THEN tab_B.col_2 = tab_C.col_3
		ELSE tab_A.col_4 = tab_C.col_3
	 ENDON 
	 CASE WHEN ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" 
	    THEN tab_B.col_2 = tab_C.col_3
		ELSE tab_A.col_4 = tab_C.col_3
	 END
Типа BOOLEAN в TSQL нет, а CASE - это скалярная функция, возвращающая одно значение определённого типа.
22 июн 17, 18:26    [20584482]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
bideveloper
Member

Откуда:
Сообщений: 503
_human,

можно разделить на 2 запроса по условию в case и обьединить результаты через Union all.
22 июн 17, 18:54    [20584525]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
Remind
Member

Откуда: UK
Сообщений: 523
_human,

IF ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> ""
  SELECT *
  FROM tab_A
  LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
  LEFT JOIN tab_C ON tab_B.col_2 = tab_C.col_3
    AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)
ELSE
  SELECT *
  FROM tab_A
  LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
  LEFT JOIN tab_C ON tab_A.col_4 = tab_C.col_3
    AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)
22 июн 17, 19:27    [20584569]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
Remind
Member

Откуда: UK
Сообщений: 523
Написал бред, удалите плз предыдущий пост :)
22 июн 17, 19:30    [20584573]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
_human
Помогите переписать сей шлак, никик не соображу как переписать без CASE

SELECT *
 FROM tab_A
 LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
 LEFT JOIN tab_C ON 
	 CASE WHEN ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" 
	    THEN tab_B.col_2 = tab_C.col_3
		ELSE tab_A.col_4 = tab_C.col_3
	 END
	 AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)

Понял буквально. т.е. переписать без CASE:
SELECT *
 FROM tab_A
 LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
 LEFT JOIN tab_C ON 
	 (((tab_B.col_2 = tab_C.col_3) and (ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" ))
	 or
	   (tab_A.col_4 = tab_C.col_3)  and not (ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" ))
	 AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)
23 июн 17, 08:48    [20585195]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
_human,

переписать в грубом понимании это будет OR, но разницы для Engine это иметь не будет
23 июн 17, 08:55    [20585216]     Ответить | Цитировать Сообщить модератору
 Re: Переписать запрос  [new]
_human
Member

Откуда:
Сообщений: 560
iap
Типа BOOLEAN в TSQL нет, а CASE - это скалярная функция, возвращающая одно значение определённого типа.

согласен, это чуть из другой оперы.
Вот так для TSQL будет норм. Суть вопроса не меняется
+
;with tab_A(col_1, col_4, col_6) as
(select 1, 2, '' )
, tab_B(CODE, col_2) as 
(select 1, 2)
, tab_C(col_3, col_5) as
(select 1, '')


SELECT *
 FROM tab_A
 LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
 LEFT JOIN tab_C ON tab_C.col_3 = 
	 CASE WHEN tab_A.col_1 <> '' and tab_B.col_2 <> ''
	    THEN tab_B.col_2 
		ELSE tab_A.col_4  
	 END
	 AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> '' OR tab_A.col_6 IS NOT NULL)



petre
Понял буквально. т.е. переписать без CASE:
SELECT *
 FROM tab_A
 LEFT JOIN tab_B ON tab_A.col_1 = tab_B.CODE
 LEFT JOIN tab_C ON 
	 (((tab_B.col_2 = tab_C.col_3) and (ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" ))
	 or
	   (tab_A.col_4 = tab_C.col_3)  and not (ISNULL(tab_A.col_1,"") <> "" and ISNULL(tab_B.col_2,"" ) <> "" ))
	 AND	 tab_C.col_5 = 'Val_1'
 WHERE
		(tab_A.col_6 <> "" OR tab_A.col_6 IS NOT NULL)

TaPaK
переписать в грубом понимании это будет OR, но разницы для Engine это иметь не будет


да, будет то же самое.

думал можно на два запроса как-то разбить.
Похоже что эта CASE лигика и не нужна
23 июн 17, 12:53    [20585792]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить