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

Откуда: Норильск
Сообщений: 940
Всем доброго дня. Есть таблица table1, в ней 4 поля: п1, п2, п3, п4.

Выглядит она так с данными:

п1 п2 п3 п4
1 NULL 3 NULL
4 34 3 NULL
12 NULL 3 NULL
120 NULL 3 NULL


Мне надо в Select указать только те столбцы, где во всех строках этого столбца значения null (т.е. в нашем примере запрос будет выглядеть так: Select п1, п2, п4 from table1)

А заранее я не знаю, какие столбцы выбирать и какие там будут данные. Т.е. это надо сделать динамически.

Всем заранее спасибо.
1 ноя 16, 07:51    [19844367]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Настенька
в нашем примере запрос будет выглядеть так: Select п1, п2, п4 from table1
Это противоречит предыдущей фразе
Настенька
указать только те столбцы, где во всех строках этого столбца значения null
1 ноя 16, 08:08    [19844384]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 940
Ой, точно, ошиблась, извините, как раз столбец 4 и не должен входить, т.к. там во всех строках null.
Запрос должен быть такой:

Select п1, п2, п3 from table1
1 ноя 16, 08:11    [19844389]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21242
Тогда возникает подозрение, что Вы неправильно подходите к решению какой-то своей задачи... зависимость структуры результата от данных - это нереляционно. Думаю, есть смысл озвучить задачу, а не выбранный Вами (имхо ошибочный) способ её решения.
1 ноя 16, 09:41    [19844563]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
iiyama
Member

Откуда:
Сообщений: 642
Настенька,

может разрулить на клиенте?

declare @t table(p1 int, p2 int, p3 int, p4 int)
insert into @t values(1,2,3,NULL), (1, NULL,3,NULL), (1,2,NULL, NULL)

select 
	p1, CASE WHEN COUNT(p1) OVER()=0 THEN 0 ELSE 1 END AS visible_p1,
	p2, CASE WHEN COUNT(p2) OVER()=0 THEN 0 ELSE 1 END AS visible_p2,
	p3, CASE WHEN COUNT(p3) OVER()=0 THEN 0 ELSE 1 END AS visible_p3,
	p4, CASE WHEN COUNT(p4) OVER()=0 THEN 0 ELSE 1 END AS visible_p4
from @t
1 ноя 16, 10:55    [19844917]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 940
Нет, надо на сервере.
Хм, думала, это элементарный запрос, а оказалось - нет. :(

Server 2000, там over нет.
1 ноя 16, 11:46    [19845257]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Настенька
Нет, надо на сервере.
Хм, думала, это элементарный запрос, а оказалось - нет. :(

Server 2000, там over нет.

не здраво всё это, а если все поля будут null?
1 ноя 16, 11:49    [19845273]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 940
Все не будут, есть обязательное поле.

Запрос-то все-таки напишите.
1 ноя 16, 11:50    [19845292]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Настенька
Все не будут, есть обязательное поле.

Запрос-то все-таки напишите.
Вы хотите заставить сервер встать на голову и дрыгать при этом ногами!
Почему бы не проектировать систему, держа в голове основные возможности SQL?
Чтобы сервер всегда делал то, для чего он предназначен?

Можно, конечно, и с DSQL разобраться... Но криво это всё.
1 ноя 16, 11:56    [19845331]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 940
Ясно, ладно, сама разберусь, всем спасибо за советы.
Буду думать с DSQL.
Если кому интересно, отпишусь потом, что получилось.
1 ноя 16, 11:59    [19845349]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Настенька
Все не будут, есть обязательное поле.

Запрос-то все-таки напишите.

мда... упорно внедряем идиотизм

CREATE TABLE #T 
(
	P1	INT,
	P2	INT,
	P3	INT,
	P4	INT 
)
INSERT INTO #T(P1,P2,P3,P4)
VALUES
(1	,NULL	,3	,NULL),
(4	,34	,3	,NULL),
(12	,NULL	,3	,NULL),
(120	,NULL	,3	,NULL)

DECLARE @SQL VARCHAR(MAX) = ''

IF (SELECT COUNT(1) FROM #T WHERE P1 IS NOT NULL) <> 0 
	SET @SQL += 'P1,'
IF (SELECT COUNT(1) FROM #T WHERE P2 IS NOT NULL) <> 0 
	SET @SQL += 'P2,'
IF (SELECT COUNT(1) FROM #T WHERE P3 IS NOT NULL) <> 0 
	SET @SQL += 'P3,'
IF (SELECT COUNT(1) FROM #T WHERE P4 IS NOT NULL) <> 0 
	SET @SQL += 'P4,'

SET @SQL = 'SELECT ' + LEFT(@SQL,LEN(@SQL)-1) + ' FROM #T'
EXEC(@SQL)
DROP TABLE #T
1 ноя 16, 12:00    [19845353]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
buven
Member

Откуда:
Сообщений: 792
TaPaK
мда... упорно внедряем идиотизм


Судя по

автор Настенька
Server 2000, там over нет.


Идиотизм уже давно внедрен.
Доступа к исходникам клиента видимо нет, или нет знания, как его получить, а задачи решать как то надо, вот и вертим сервер как можем.
Угадал?
Настенька, назовите систему, если это не хоумдев - может тут встретите по ней спеца.
1 ноя 16, 12:08    [19845404]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
кстати, можно и короче, заменить
SELECT COUNT(P4) FROM #T
1 ноя 16, 12:10    [19845410]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
Верблюд
Member

Откуда: Яженичеловек!!!
Сообщений: 65007
TaPaK
Настенька
Все не будут, есть обязательное поле.

Запрос-то все-таки напишите.

мда... упорно внедряем идиотизм

CREATE TABLE #T 
(
	P1	INT,
	P2	INT,
	P3	INT,
	P4	INT 
)
INSERT INTO #T(P1,P2,P3,P4)
VALUES
(1	,NULL	,3	,NULL),
(4	,34	,3	,NULL),
(12	,NULL	,3	,NULL),
(120	,NULL	,3	,NULL)

DECLARE @SQL VARCHAR(MAX) = ''

IF (SELECT COUNT(1) FROM #T WHERE P1 IS NOT NULL) <> 0 
	SET @SQL += 'P1,'
IF (SELECT COUNT(1) FROM #T WHERE P2 IS NOT NULL) <> 0 
	SET @SQL += 'P2,'
IF (SELECT COUNT(1) FROM #T WHERE P3 IS NOT NULL) <> 0 
	SET @SQL += 'P3,'
IF (SELECT COUNT(1) FROM #T WHERE P4 IS NOT NULL) <> 0 
	SET @SQL += 'P4,'

SET @SQL = 'SELECT ' + LEFT(@SQL,LEN(@SQL)-1) + ' FROM #T'
EXEC(@SQL)
DROP TABLE #T


Маразм крепчал. Можно еще временную табличку создать, а потом удалять в ней поля
1 ноя 16, 12:18    [19845467]     Ответить | Цитировать Сообщить модератору
 Re: Выбор полей в зависимости от значения  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Настенька
Нет, надо на сервере.
Задача, мягко говоря, дурацкая...
+ Как сделать не анализируя каждый раз содержимое таблицы
use tempdb;
go

create table dbo.t (id int identity primary key, n1 int null, n2 int null, n3 int null, n4 int null);
go

create view dbo.vt
with schemabinding
as
select
 count_big(*) as c,
 count_big(n1) as cn1,
 count_big(n2) as cn2,
 count_big(n3) as cn3,
 count_big(n4) as cn4
from
 dbo.t;
go

create unique clustered index CUIX_vt__c on dbo.vt (c);
go

insert into dbo.t values (1, null, 1, null);
insert into dbo.t values (null, null, 1, null);
insert into dbo.t values (1, null, 1, null);
insert into dbo.t values (1, null, null, null);
insert into dbo.t values (null, null, 1, null);

declare @s varchar(8000);

select
 @s = 'select id' + 
  case when cn1 > 0 then ', n1' else '' end + 
  case when cn2 > 0 then ', n2' else '' end + 
  case when cn3 > 0 then ', n3' else '' end + 
  case when cn4 > 0 then ', n4' else '' end +
  ' from dbo.t'
from
 dbo.vt;

select @s;
exec(@s);
go

drop view dbo.vt;
drop table dbo.t;
go
1 ноя 16, 12:19    [19845472]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить