【问题标题】:Select * Except Null Fields选择 * 空字段除外
【发布时间】:2012-04-05 11:33:50
【问题描述】:

我的数据库有问题。我有以下内容:

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

如何创建一个从 STORY 中选择 * 的 SELECT 语句,除了空字段。例如,如果一个故事没有争论者/艺术家,我不希望该领域出现。

例如:

select * from story where name_s = 'StoryName1' 的结果将是以下table 但因为这两个字段是 NULL 我希望它是这样的table

为了让最后一张桌子以这种方式显示,我这样做了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'

【问题讨论】:

  • 您只能使用一些疯狂的动态 SQL 来真正做到这一点……我认为您不会想要这样做。您要解决的问题是什么?
  • 如果您选择了两行并且它们各有不同的列并具有NULL 值,您期望返回什么?还是你只会选择一行?!
  • 你想做什么isnull(artist, '')不能?
  • @MichaelFredrickson @SirCrispalot 我不假装会发生这种情况,我已经考虑过了,你说的就是想象这个('StoryName1','StoryChars1',null,'John',default,'BookName1',13), ('StoryName2','StoryChars2',null,default,'Peter','BookName2',35), 对吧?我想我通过使用where name_s = 'StoryName1' 清除了这一点。现在,想象一下我将为此目的在每个select 中使用where 我该如何解决这个问题
  • 我正在尝试做这样的事情(这段代码显然不存在只是一个试图更好地解释我的例子)select ""notnullcollumns"" from story where name_s = 'StoryName1'

标签: sql sql-server-2008 select null except


【解决方案1】:

你可以这样做:

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...

但如果你觉得这很好,那么你可能需要改变你的设计。

【讨论】:

    【解决方案2】:

    记住*的含义。它只是枚举投影、AKA、列的替代品。

    如何不选择给定行中的列?这是没有意义的,因为你的输出必须有一个布局。

    您应该认真考虑一下输出布局会如何,然后告诉我们。目前,这个问题没有多大意义。

    【讨论】:

      【解决方案3】:

      这是不可能的!您的示例显示了两个表,每个表只有一行,但表通常有更多行。如果您有一个包含两行的表,并且其中只有一个在这些列上有 NULL 值怎么办?

      现在,您可以像示例中那样省略 SELECT 子句中的列。或者可以使用COALESCENULL 值更改为非NULL

      【讨论】:

      • 我明白你在说什么,如果里面有两行或多行它就行不通,但想象一下我有这个select ""notnullcollumns"" from story where name_s = 'StoryName1' 实际上会将选择限制为 1 行,这就是我想要的
      • @Fabio,是的,它可以像你说的那样工作,但它不存在。对于所有列,它要么是 *,要么是手动列出这些列。
      【解决方案4】:

      为什么不选择问题中的最后一个选项?如果您不想要它们,请不要添加它们。 Select * 将返回所有字段(列),而不考虑值。

      PS:这闻起来像一个多值字段,你应该避免它们:

      chars varchar(100) not null
      

      【讨论】:

      • 关于chars字段,它不是真正的字符,它表示故事中出现的人物角色
      猜你喜欢
      • 2012-12-19
      • 1970-01-01
      • 2018-12-27
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多