Выберите * За исключением пустых полей - PullRequest
0 голосов
/ 21 марта 2012

У меня проблема с базой данных. У меня есть следующее:

create table book
(
    name_b varchaR(50) primary key,
    typee varchaR(50) not null,
    nmbr integer unique not null,
    yeare numeric(4,0) default null,
)

create table story
(
    id integer identity(1,1) primary key,
    name_s varchar(100) not null,
    chars varchar(100) not null,
    code varchaR(200) null,
    artist varchar(100) default null,
    argument varchar(100) default null,
    book_ref_name varchar(50) references book(name_b),
    book_ref_nmbr integer references book(nmbr)
)

insert into story values
('StoryName1','StoryChars1',null,default,default,'BookName1',13),
('StoryName2','StoryChars2',null,default,default,'BookName2',35),
('StoryName3','StoryChars3',null,default,default,'BookName3',125)

insert into book values
('BookName1','Type1',13,default),
('BookName2','Type2',35,default),
('BookName3','Type3',125,default)


UPDATE story
SET code = name_s + '-' + chars + '-' + book_ref_name + '-' + Convert(varchar(50), book_ref_nmbr)
WHERE code IS NULL

как я могу сделать оператор SELECT, который выбирает * из STORY, кроме пустых полей. например, если в истории нет аргументатора / исполнителя, я не хочу, чтобы это поле отображалось.

например:

результаты select * from story where name_s = 'StoryName1' будут следующими: таблица , но, поскольку эти два поля имеют значение NULL, я бы хотел, чтобы это было так таблица

для последней таблицы, чтобы показать, как я это сделал select id,name_s,chars,code,book_ref_name,book_ref_nmbr from story where name_s = 'StoryName1'

я пытаюсь сделать что-то подобное (этого кода явно не существует, это просто пример, чтобы попытаться объяснить меня лучше)

select ""notnullcollumns"" from story where name_s = 'StoryName1'

Ответы [ 4 ]

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

Запомните значение *. Это просто замена для перечисления проекции, АКА, столбцы.

Как бы вы не выбрали столбец в данной строке? Это не имеет смысла, потому что ваш вывод должен иметь макет.

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

1 голос
/ 21 марта 2012

Это невозможно!В ваших примерах показаны две таблицы с одной строкой каждая, но в таблицах обычно больше строк.Что если у вас была таблица с двумя строками, и только у одной из них были значения NULL для этих столбцов?

Теперь, что вы можете сделать, это просто опустить столбцы в предложении SELECT, как впример.Или, возможно, используйте COALESCE, чтобы изменить значения NULL на не- NULL.

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

Вы могли бы сделать что-то вроде этого:

SELECT id, 
      'code' AS a_type, code AS a_value
  FROM story
UNION
SELECT id, 
      'artist' AS a_type, artist AS a_value
  FROM story
UNION
SELECT id, 
      'argument' AS a_type, argument AS a_value
  FROM story
UNION...

, но если вам это нравится, вам, вероятно, придется изменить свой дизайн.

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

Почему бы не перейти к последнему выбору в вашем вопросе? Если вы не хотите их, не добавляйте их. Select * вернет все поля (столбцы) независимо от значений.

PS: Это пахнет как многозначное поле, и вы должны избегать их:

chars varchar(100) not null
...