【问题标题】:concatenating results from SQL query and NULL columns连接来自 SQL 查询和 NULL 列的结果
【发布时间】:2010-05-11 14:54:09
【问题描述】:

我需要将表格的几列连接成一个值,然后在 asp 下拉列表中显示该值。我发出的SQL代码如下:

SELECT UserID, CustomerNum, UserName + ' - ' + UserAddress + ',' + UserCity + ' ' + UserState AS UserInfo 来自用户 在哪里(客户编号 = @客户编号) 按用户名订购

然后我将“UserInfo”设置为下拉列表中的文本字段。

这通常有效,但有时数据库中的某一列为空(例如,UserState)。发生这种情况时,整个串联为空,我在下拉列表中得到一个空条目。

SQLServer 中有什么东西可以让我忽略那些 NULL 结果,还是我必须在 DataBind 事件中编写一些代码?

谢谢

【问题讨论】:

    标签: asp.net sql sql-server drop-down-menu


    【解决方案1】:

    把它包裹起来

    COALESCE(UserName,'') + ' - ' + 
    COALESCE(UserAddress,'') + ',' + 
    COALESCE(UserCity,'') + ' ' + 
    COALESCE(UserState,'') AS UserInfo
    

    【讨论】:

      【解决方案2】:

      对于 SQL Server,您有三个选择:

      1. IsNull - 这是最古老和最兼容的方法,尽管它在 SQL Server Compact Edition 中不存在(不知道这是否相关)。它接受两个参数并返回两个非 null 参数中的第一个,如果两者都是,则返回 null。
      2. Coalesce - 这是较新的,是新开发的首选。类似于IsNull,但可以接受两个以上的参数。与IsNull 一样,它将返回第一个非空参数,如果都是,则返回空。
      3. CONCAT_NULL_YIELDS_NULL - 这是一个数据库选项,可以设置为ON 或OFF。意思应该是不言自明的,但这里是MSDN link。

      【讨论】:

        【解决方案3】:

        对于可以为空的列做这样的事情。

        ISNULL(UserState, '')
        

        【讨论】:

          【解决方案4】:

          使用 NULL 连接对您有利,这将删除不必要的分隔符:

          SELECT 
              UserID, CustomerNum
                  ,ISNULL(UserName+' - ','')
                       +ISNULL(UserAddress+', ','')
                       +ISNULL(UserCity+' ','')
                       +ISNULL(UserState,'') AS UserInfo 
              FROM Users 
              WHERE CustomerNum = @CustomerNum 
              ORDER BY UserName
          

          工作示例:

          DECLARE @Users table (userID int, CustomerNum int,UserName varchar(20), UserAddress varchar(20),  UserCity varchar(20), UserState varchar(20))
          INSERT @Users VALUES (1,111,'Sam','123 First St.', 'city name', 'state name')
          INSERT @Users VALUES (2,111,null,'123 First St.', 'city name', 'state name')
          INSERT @Users VALUES (3,111,'Sam',null, 'city name', 'state name')
          INSERT @Users VALUES (4,111,'Sam','123 First St.', null, 'state name')
          INSERT @Users VALUES (5,111,'Sam','123 First St.', 'city name', null)
          INSERT @Users VALUES (6,111,null,null, 'city name', 'state name')
          
          SELECT 
              UserID, CustomerNum
                  ,ISNULL(UserName+' - ','')
                       +ISNULL(UserAddress+', ','')
                       +ISNULL(UserCity+' ','')
                       +ISNULL(UserState,'') AS UserInfo 
              FROM @Users 
              --WHERE CustomerNum = @CustomerNum 
              ORDER BY userID
          

          输出:

          UserID      CustomerNum UserInfo
          ----------- ----------- -------------------------------------------
          1           111         Sam - 123 First St., city name state name
          2           111         123 First St., city name state name
          3           111         Sam - city name state name
          4           111         Sam - 123 First St., state name
          5           111         Sam - 123 First St., city name 
          6           111         city name state name
          
          (6 row(s) affected)
          

          【讨论】:

            【解决方案5】:

            你可以这样做:

            SELECT UserID, CustomerNum, UserName + ' - ' + 
               ISNULL(UserAddress + ',','') + ISNULL(UserCity,'') + ' ' + ISNULL(UserState,'')
               AS UserInfo 
            FROM Users 
            WHERE (CustomerNum = @CustomerNum) ORDER BY UserName
            

            【讨论】:

              【解决方案6】:

              如果您想忽略空结果(排除它们),您可以将我在下面的内容添加到您的WHERE。 ISNULL 或 COALESCE 可用于如上所述为空列选择空字符串,如果这是您需要做的。

              ...
              WHERE UserName is not null
              AND   UserAddress is not null
              AND   UserCity is not null
              AND   UserState is not null
              

              【讨论】:

                猜你喜欢
                • 2016-05-23
                • 1970-01-01
                • 2023-03-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多