积极答复者
sql的where条件中是否null相关条件怎么写?

问题
-
CTWYMeetingTable中有三个列:1. CTWYMeetingNumberID 为自增的数字(int);2. CTWYMeetingNumberC是会议编号(nvarchar(255)
);3. CTWYMeetingPictureUrlC是开会内容扫描件的文件名(nvarchar(255)
)。
它们的关系是:CTWYMeetingNumberC不会为null,并且一般都对应一个CTWYMeetingPictureUrlC,但CTWYMeetingPictureUrlC可null。
我用sql数据源和GridView来显示它的内容。
再增加两Dropdownlist来选择条件,这个DropDownList_Choose的值为“未选择”时,显示全部的数据;为“有对应图片”时,只显示CTWYMeetingPictureUrlC不为null的项;为“无对应图片”,只显示CTWYMeetingPictureUrlC为null的项。同时另一个DropDownList_Year用来检测CTWYMeetingNumberC的年份,如果选择了'2013',则只显示2013年的CTWYMeetingNumberC
我只会写“未选择”时的sql语句,要如何加入“年份选择”、“有对应图片”和“无对应图片”这些更多条件呢?附数据库截图,请大家帮忙看看,3Q!
SELECT DISTINCT [CTWYMeetingNumberID], [CTWYMeetingNumberC], [CTWYMeetingPictureUrlC] FROM [CTWYMeetingTable] WHERE ISNULL(@CTWYMeetingPictrureUrl, N'') = '未选择' or CTWYMeetingPictrureUrl=@CTWYMeetingPictrureUrl
.......................
=========================图1=========================
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
答案
-
反复测试后,决定采取下面的代码,简单易懂,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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
- 已标记为答案 Michelle GeModerator 2014年6月18日 9:40
全部回复
-
刚才用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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
-
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, 则显示所有年份 )
-
周建大侠,你的好像没有表达得到
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执行计划复杂一些
- 已编辑 Steven.桦仔 2014年6月11日 2:12 修改回复
-
您好,
一般來說 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)
-
谢谢解答。我把完整的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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
-
您好,
設定 DataSource中的 SqlDataSource.SelectCommandType 属性 。
<asp:SqlDataSource id="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyNorthwind%>" SelectCommandType="StoredProcedure" SelectCommand="sp_lastnames"> </asp:SqlDataSource>
-
我写了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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
-
下面是我完整的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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
- 已编辑 linjiangxian11 2014年6月13日 7:59
-
改为一下顺序试试
<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>
-
您好,
您可以直接輸入欄位值,或是在ASPX中直接指定dropdownlist的DataTextField 及 DataValueField的值。
-
直接输入栏位?是这样写么?不行啊!
<asp:DropDownList ID="DropDownList_CTWYPic" runat="server" AutoPostBack="True" Width="200px" DataSourceID="SqlDataSource_CTWYPic" DataTextField="CTWYMeetingNumberC" DataValueField="CTWYMeetingNumberC"> </asp:DropDownList>
C# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
-
您好,您可以執行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'未选择' -
反复测试后,决定采取下面的代码,简单易懂,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# 菜鸟中的雏鸟!提的问题也许很幼稚,但我是认真的。希望看在党国的面子上拉兄弟一把!
- 已标记为答案 Michelle GeModerator 2014年6月18日 9:40