none
sql的where条件中是否null相关条件怎么写? RRS feed

  • 问题

  • CTWYMeetingTable中有三个列:1. CTWYMeetingNumberID 为自增的数字(int);2. CTWYMeetingNumberC是会议编号(nvarchar(255)

    );3. CTWYMeetingPictureUrlC是开会内容扫描件的文件名(nvarchar(255)

    )。

        它们的关系是:CTWYMeetingNumberC不会为null,并且一般都对应一个CTWYMeetingPictureUrlC,但CTWYMeetingPictureUrlCnull

    我用sql数据源和GridView来显示它的内容。

    再增加Dropdownlist来选择条件,这个DropDownList_Choose的值为“未选择”时,显示全部的数据;为“有对应图片”时,只显示CTWYMeetingPictureUrlC不为null的项;为“无对应图片”,只显示CTWYMeetingPictureUrlCnull的项。同时另一个DropDownList_Year用来检测CTWYMeetingNumberC的年份,如果选择了'2013',则只显示2013年的CTWYMeetingNumberC

    我只会写“未选择”时的sql语句,要如何加入“年份选择”、“有对应图片”和“无对应图片”这些更多条件呢?附数据库截图,请大家帮忙看看,3Q

    SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] FROM [CTWYMeetingTable] WHERE ISNULL(@CTWYMeetingPictrureUrl, N'') = '未选择' or CTWYMeetingPictrureUrl=@CTWYMeetingPictrureUrl

    .......................

    =========================图1=========================


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月10日 7:55

答案

  •     反复测试后,决定采取下面的代码,简单易懂,asp应用也方便,适合我这菜鸟,呵呵。谢谢大家!

    USE [长铁物业公司资产数据库]
    GO
    /****** Object:  StoredProcedure [dbo].[Pro_ContractPic]    Script Date: 06/17/2014 09:23:33 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER proc [dbo].[Pro_ContractPic]
    (@c nvarchar(255),@y nvarchar(255),@t nvarchar(255))
    as
    begin
    
    SELECT DISTINCT [CID] ,PropertyType, [ContractNumber] , [ContractPictureUrl] 
    FROM [ContractTable] a join PropertyTable b
    on a.ContractID=b.PropertyID
    WHERE 
    	( -- ContractNumber 是否有图片
    		( -- 为“未选择”时,显示全部的数据
    			@c = '未选择'
    		)
    		OR( -- 为“有对应图片”时,只显示CTWYMeetingPictureUrlC不为null的项
    			@c = '有对应图片' AND ContractPictureUrl IS NOT NULL
    		)
    		OR( -- 为“无对应图片”,只显示CTWYMeetingPictureUrlC为null的项
    			@c = '无对应图片' AND ContractPictureUrl IS NULL
    		)
    	)
    AND ( -- ContractNumber 对应的年份
    		    (@y ='未选择')
    		or
    		    (@y<>'未选择' and ContractNumber like '%'+'-'+ @y+'-'+'%')    
    		 
    	)
    AND ( -- PropertyType
    		    (@t ='未选择')
    		or
    		    (@t<>'未选择' and PropertyType =@t)    
    		 
    	)
    end	


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月17日 1:35

全部回复

  • WHERE   ISNULL(@CTWYMeetingPictrureUrl, N'') = '未选择'
            OR CTWYMeetingPictrureUrl = @CTWYMeetingPictrureUrl

    where 条件后面判断是否为null没有意义,改为@CTWYMeetingPictrureUrl = '未选择' 不就行了

    一般加isnull是加在select语句后面

    2014年6月10日 8:53
  •     刚才用if把我需要的结果写出来了,觉得有点麻烦,代码如下。不知道这种条件能否直接在where 后面写呢?

    declare @c nvarchar(255),@y nvarchar(255)
    --set @c='未选择'
    --set @c='有对应图片'
    set @c='无对应图片'
    set @y = '2014'
    if (@y is not null)
      begin
        if @c='未选择'
          begin
            select * from CTWYMeetingTable where CTWYMeetingNumberC like '%'+@y+'%' 
          end
        if @c='有对应图片'
          begin
            select * from CTWYMeetingTable where CTWYMeetingNumberC like '%'+@y+'%' and CTWYMeetingPictureUrlC is not null
          end  
        if @c='无对应图片'
            select * from CTWYMeetingTable where CTWYMeetingNumberC like '%'+@y+'%' and CTWYMeetingPictureUrlC is  null
         
      end
      else 
      begin
        if @c='未选择'
          begin
            select * from CTWYMeetingTable  
          end
        if @c='有对应图片'
          begin
            select * from CTWYMeetingTable where  CTWYMeetingPictureUrlC is not null
          end  
        if @c='无对应图片' 
            select * from CTWYMeetingTable where  CTWYMeetingPictureUrlC is  null
     
      end


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月10日 9:07
  • 根据输入的不同改变查询语句,还是没有必要在where后面写
    2014年6月10日 9:17
  • SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] 
    FROM [CTWYMeetingTable] 
    WHERE 
    	( -- DropDownList_Choose的值, 下面 @DropDownList_Choose 变量对应选择值
    		( -- 为“未选择”时,显示全部的数据
    			@DropDownList_Choose = '未选择'
    		)
    		OR( -- 为“有对应图片”时,只显示CTWYMeetingPictureUrlC不为null的项
    			@DropDownList_Choose = '有对应图片' AND CTWYMeetingPictureUrlC IS NOT NULL
    		)
    		OR( -- 为“无对应图片”,只显示CTWYMeetingPictureUrlC为null的项
    			@DropDownList_Choose = '无对应图片' AND CTWYMeetingPictureUrlC IS NULL
    		)
    	)
    	AND ( -- 同时另一个DropDownList_Year用来检测CTWYMeetingNumberC的年份
    		CTWYMeetingNumberC = @DropDownList_Year
    		OR @DropDownList_Year IS NULL	-- 如果 DropDownList_Year 为NULL, 则显示所有年份
    	)
    

    2014年6月11日 1:24
  • 周建大侠,你的好像没有表达得到

    set @y = '2014'
    if (@y is not null)

    @y变量的情况

    ==================================================================

    开发人员一般会这样做:拼接SQL

    --存储过程
    declare @c nvarchar(255),@y nvarchar(255)

    set @c='无对应图片'
    set @y = '2014'

    DECLARE @sql NVARCHAR(MAX)
    SET @sql='SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] 
    FROM [CTWYMeetingTable] where 1=1'




    if (@y is not null)
      begin
        if @c='未选择'
          begin
            SET  @sql= @sql +'and CTWYMeetingNumberC like' +'''%'''+@y+'''%''' 
          end
        if @c='有对应图片'
          begin
              SET  @sql= @sql +'and CTWYMeetingNumberC like' +'''%'''+@y+'''%''' +'and CTWYMeetingPictureUrlC is not null' 
          end  
        if @c='无对应图片'
    SET  @sql= @sql +'and CTWYMeetingNumberC like' +'''%'''+@y+'''%''' +'and CTWYMeetingPictureUrlC is  null' 
      END
      EXEC (@sql)

    ============================================================

    @y 和@c是存储过程传入的参数,我就不写完整了,如果还有其他参数的话,如此类推

    个人不是很推荐周建大侠那种方法,使用or,会令sqlserver执行计划复杂一些


    2014年6月11日 1:57
  • 您好,

    一般來說 Dropdownlist 如果沒有選取的話,顯示出來是「未选择,而它的內容是空字串!

    所以如果您有2個 Dropdownlist 來篩選的話,判斷用 isnull + or 然後2個條件用AND去結合,如下,

    DECLARE @CTWYMeetingPictrureUrl VARCHAR(30)
    DECLARE @CTWYMeetingNumberC VARCHAR(30)
    SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] 
    FROM [CTWYMeetingTable] 
    WHERE (ISNULL(@CTWYMeetingPictrureUrl, '') = '' or CTWYMeetingPictureUrlC=@CTWYMeetingPictrureUrl)
    AND (ISNULL(@CTWYMeetingNumberC, '') = '' or CTWYMeetingNumberC=@CTWYMeetingNumberC)



    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年6月11日 2:36
  •     谢谢解答。我把完整的sql写出来了,写成了存储过程。但作为DropDownList的数据源时,DropDownList不显示内容。

    我想进一步问问,这种拼接sql的存储过程,如何将它的CTWYMeetingNumberC显示到DropDownList上。

    ====================sql存储过程================

    create procedure Pro_CTWYMeetingPic
    @c nvarchar(255),@y nvarchar(255),@sql NVARCHAR(MAX)
    as
    SET @sql='SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] 
    FROM [CTWYMeetingTable] where 1=1 '
    if (@y is not null)
      begin
        if @c='未选择'
          begin
            SET  @sql= @sql +'and CTWYMeetingNumberC like ' +'''%'+@y+'%'''   
          end
        if @c='有对应图片'
          begin
              SET  @sql= @sql +'and CTWYMeetingNumberC like ' +'''%'+@y+'%''' +' and CTWYMeetingPictureUrlC is not null' 
          end  
        if @c='无对应图片'
          begin
              SET  @sql= @sql +'and CTWYMeetingNumberC like ' +'''%'+@y+'%''' +' and CTWYMeetingPictureUrlC is  null' 
          end 
      end
      
    else
      begin
        begin
        if @c='未选择'
          begin
            SET  @sql= @sql     
          end
        if @c='有对应图片'
          begin
              SET  @sql= @sql +' and CTWYMeetingPictureUrlC is not null'  
          end  
        if @c='无对应图片'
          begin
              SET  @sql= @sql +' and CTWYMeetingPictureUrlC is  null'  
          end 
      end
      end  
      
    EXEC (@sql)

    ====================asp.net====================

    <asp:DropDownList ID="DropDownList_CTWYPic" runat="server" AutoPostBack="True" 
                        DataSourceID="SqlDataSource_CTWYPic" DataTextField="CTWYMeetingNumberC" 
                        DataValueField="CTWYMeetingNumberC" 
                        onselectedindexchanged="DropDownList_CTWYPic_SelectedIndexChanged" 
                        Width="200px">
                    </asp:DropDownList>


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月13日 2:51
  • 你先将@sql print出来看一下有没有错,用法跟你的普通sql是一样的,只是拼接sql可以根据你的条件来拼接,灵活性更好

    PRINT @sql

    2014年6月13日 3:03
  • 您好,

    設定 DataSource中的 SqlDataSource.SelectCommandType 属性

    <asp:SqlDataSource
    	id="SqlDataSource1"
    	runat="server"
    	ConnectionString="<%$ ConnectionStrings:MyNorthwind%>"
    	SelectCommandType="StoredProcedure"                
    	SelectCommand="sp_lastnames">
    </asp:SqlDataSource>


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年6月13日 3:39
  • 我写了selectcommandtype 的属性啊。。。而且sql 拼接语句测试也成功了。

       

    <asp:SqlDataSource ID="SqlDataSource_CTWYPic" runat="server" 
                        ConnectionString="<%$ ConnectionStrings:长铁物业公司资产数据库ConnectionString %>" 
                        SelectCommand="Pro_CTWYMeetingPic" SelectCommandType="StoredProcedure">
                        <SelectParameters>
                            <asp:ControlParameter ControlID="DropDownList_Choose" Name="c" 
                                PropertyName="SelectedValue" />
                            <asp:ControlParameter ControlID="DropDownList_Year" Name="y" 
                                PropertyName="SelectedValue" />
                            <asp:Parameter Name="sql" />
                        </SelectParameters>
                    </asp:SqlDataSource>


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月13日 3:45
  • 你建一个测试项目,建一个空的webform或者winform来测试一下是否获取到数据

    调试一下,最好就是winform

    2014年6月13日 3:52
  •     下面是我完整的sql存储过程及asp代码及发现问题的图。

    我觉得问题就在于,我的存储过程本身就是一个拼接语句,造成了在asp中的dropdownlist法取得对应的字段值,见图1中就可以发现没有相对应的字段值...

    ====================图1===================

    ====================sql===================

    create procedure Pro_CTWYMeetingPic
    (@c nvarchar(255),@y nvarchar(255))
    AS
    BEGIN
    DECLARE @sql NVARCHAR(MAX)
    SET @sql='SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] 
    FROM [CTWYMeetingTable] where 1=1 '
    if (@y is not null)
      begin
        if @c='未选择'
          begin
            SET  @sql= @sql +'and CTWYMeetingNumberC like ' +'''%'+@y+'%'''   
          end
        if @c='有对应图片'
          begin
              SET  @sql= @sql +'and CTWYMeetingNumberC like ' +'''%'+@y+'%''' +' and CTWYMeetingPictureUrlC is not null' 
          end  
        if @c='无对应图片'
          begin
              SET  @sql= @sql +'and CTWYMeetingNumberC like ' +'''%'+@y+'%''' +' and CTWYMeetingPictureUrlC is  null' 
          end 
      end
      
    else
      begin
        begin
        if @c='未选择'
          begin
            SET  @sql= @sql     
          end
        if @c='有对应图片'
          begin
              SET  @sql= @sql +' and CTWYMeetingPictureUrlC is not null'  
          end  
        if @c='无对应图片'
          begin
              SET  @sql= @sql +' and CTWYMeetingPictureUrlC is  null'  
          end 
      end
      end  
      
    EXEC (@sql)
    END

    =====================asp====================

    <body>
        <form id="form1" runat="server">
        <div>
        
            <asp:DropDownList ID="DropDownList_Year" runat="server" AutoPostBack="True">
                <asp:ListItem Selected="True">未选择</asp:ListItem>
                <asp:ListItem>2012</asp:ListItem>
                <asp:ListItem>2013</asp:ListItem>
                <asp:ListItem>2014</asp:ListItem>
                <asp:ListItem>2015</asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="DropDownList_Choose" runat="server" AutoPostBack="True">
                <asp:ListItem Selected="True">未选择</asp:ListItem>
                <asp:ListItem>有对应图片</asp:ListItem>
                <asp:ListItem>无对应图片</asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="DropDownList_CTWYPic" runat="server" AutoPostBack="True"  
                Width="200px">
            </asp:DropDownList>
        
            <asp:SqlDataSource ID="SqlDataSource_CTWYPic" runat="server" 
                ConnectionString="<%$ ConnectionStrings:长铁物业公司资产数据库ConnectionString %>" 
                SelectCommand="Pro_CTWYMeetingPic" SelectCommandType="StoredProcedure">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DropDownList_Choose" Name="c" 
                        PropertyName="SelectedValue" Type="String" />
                    <asp:ControlParameter ControlID="DropDownList_Year" Name="y" 
                        PropertyName="SelectedValue" Type="String" />
                </SelectParameters>
            </asp:SqlDataSource>
        
        </div>
        </form>
    </body>


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!


    2014年6月13日 7:57
  • 改为一下顺序试试

    <body>
        <form id="form1" runat="server">
        <div>
        <asp:SqlDataSource ID="SqlDataSource_CTWYPic" runat="server" 
                ConnectionString="<%$ ConnectionStrings:长铁物业公司资产数据库ConnectionString %>" 
                SelectCommand="Pro_CTWYMeetingPic" SelectCommandType="StoredProcedure">
                <SelectParameters>
                    <asp:ControlParameter ControlID="DropDownList_Choose" Name="c" 
                        PropertyName="SelectedValue" Type="String" />
                    <asp:ControlParameter ControlID="DropDownList_Year" Name="y" 
                        PropertyName="SelectedValue" Type="String" />
                </SelectParameters>
            </asp:SqlDataSource>
    
            <asp:DropDownList ID="DropDownList_Year" runat="server" AutoPostBack="True">
                <asp:ListItem Selected="True">未选择</asp:ListItem>
                <asp:ListItem>2012</asp:ListItem>
                <asp:ListItem>2013</asp:ListItem>
                <asp:ListItem>2014</asp:ListItem>
                <asp:ListItem>2015</asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="DropDownList_Choose" runat="server" AutoPostBack="True">
                <asp:ListItem Selected="True">未选择</asp:ListItem>
                <asp:ListItem>有对应图片</asp:ListItem>
                <asp:ListItem>无对应图片</asp:ListItem>
            </asp:DropDownList>
            <asp:DropDownList ID="DropDownList_CTWYPic" runat="server" AutoPostBack="True"  
                Width="200px">
            </asp:DropDownList>
        
            
        
        </div>
        </form>
    </body>

    2014年6月13日 8:05
  •     只是改了一下控件的位置么?我测试了,还是一样不行啊!

    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月16日 1:31
  • 您好,

    您可以直接輸入欄位值,或是在ASPX中直接指定dropdownlist的DataTextField 及 DataValueField的值。


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年6月16日 1:48
  •     直接输入栏位?是这样写么?不行啊!

    <asp:DropDownList ID="DropDownList_CTWYPic" runat="server" AutoPostBack="True"  
                Width="200px" DataSourceID="SqlDataSource_CTWYPic" 
                DataTextField="CTWYMeetingNumberC" DataValueField="CTWYMeetingNumberC">
            </asp:DropDownList>


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月16日 2:47
  • 您好,您可以執行SP,看出來的結果是不是您要的,如下,
    exec Pro_CTWYMeetingPic @c=N'未选择',@y=N'未选择'
    exec Pro_CTWYMeetingPic @c=N'未选择',@y=N'2012'
    exec Pro_CTWYMeetingPic @c=N'无对应图片',@y=N'未选择'
    exec Pro_CTWYMeetingPic @c=N'未选择',@y=N'2013'
    exec Pro_CTWYMeetingPic @c=N'有对应图片',@y=N'2013'
    exec Pro_CTWYMeetingPic @c=N'无对应图片',@y=N'2013'

    如果是nvarchar比較請加上 N ,如下,
    if @c=N'未选择'


    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年6月16日 7:16
  •     反复测试后,决定采取下面的代码,简单易懂,asp应用也方便,适合我这菜鸟,呵呵。谢谢大家!

    USE [长铁物业公司资产数据库]
    GO
    /****** Object:  StoredProcedure [dbo].[Pro_ContractPic]    Script Date: 06/17/2014 09:23:33 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER proc [dbo].[Pro_ContractPic]
    (@c nvarchar(255),@y nvarchar(255),@t nvarchar(255))
    as
    begin
    
    SELECT DISTINCT [CID] ,PropertyType, [ContractNumber] , [ContractPictureUrl] 
    FROM [ContractTable] a join PropertyTable b
    on a.ContractID=b.PropertyID
    WHERE 
    	( -- ContractNumber 是否有图片
    		( -- 为“未选择”时,显示全部的数据
    			@c = '未选择'
    		)
    		OR( -- 为“有对应图片”时,只显示CTWYMeetingPictureUrlC不为null的项
    			@c = '有对应图片' AND ContractPictureUrl IS NOT NULL
    		)
    		OR( -- 为“无对应图片”,只显示CTWYMeetingPictureUrlC为null的项
    			@c = '无对应图片' AND ContractPictureUrl IS NULL
    		)
    	)
    AND ( -- ContractNumber 对应的年份
    		    (@y ='未选择')
    		or
    		    (@y<>'未选择' and ContractNumber like '%'+'-'+ @y+'-'+'%')    
    		 
    	)
    AND ( -- PropertyType
    		    (@t ='未选择')
    		or
    		    (@t<>'未选择' and PropertyType =@t)    
    		 
    	)
    end	


    C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!

    2014年6月17日 1:35