1

我刚刚学习 SQL,遇到了一个困难。我的数据表看起来像这样

DBO 数据

Id | Name | Surname | Title  | Location
----------------------------------------
1  | xxx  | abc     | def    | London
2  | xxx  | abc     | def    | Oslo
3  | xxx  | abc     | def    | New York

现在我想获取 id、name、title 和 surname,我使用这样的查询:

SELECT 
    Id, Name, Surname, Title 
FROM 
    DATA 
WHERE 
    Location = 'London' -- (this is user input)

但是如果用户输入All或子句中World的空字符串,我会遇到问题WHERE,我希望查询返回所有行。是否可以通过编写另一个查询来处理上述特殊情况来做到这一点????

我正在将 ASP.net 与这样的数据源一起使用

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
     ConnectionString="<%$ ConnectionStrings:MainConnectionString %>" 
     SelectCommand="SELECT [Name], [Id], [Surname], [Title] FROM [DATA] WHERE [Location] = @Location)" >
   <SelectParameters>
       <asp:ControlParameter ControlID="Label1" Name="Location" 
            PropertyName="Text" Type="String" />
   </SelectParameters>
</asp:SqlDataSource>`

输入取决于 URL 的路由路径localhost:56789/People/London/

对应的VB文件是

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load
    If (Request.PathInfo.Length = 0) Then

    Else
        Dim t = Request.PathInfo.Substring(1)
        Label1.Text = t
    End If
End Sub

我知道我可以做这个应用程序方面,但如果这在查询本身是可能的,我只是好奇。

4

4 回答 4

2

如果您真的想在查询中执行此操作,请尝试以下操作:

SELECT 
    Id, Name, Surname, Tittle 
FROM 
    data 
WHERE 
    Location = <input> OR
    <input> in ('All', 'World', '')
于 2013-05-04T19:56:15.877 回答
2

我这里没有 SQL Server 实例来确认此语法,但您可以执行以下操作;

SELECT 
    Id, Name, Surname, Tittle 
FROM 
    data 
WHERE 
   case 
      when <input> = 'All' then 1=1 
      when <input> = 'World' then 1=1
      else location = <input>
   end

这是如何工作的,它利用了每个谓词(实际上是 where 子句)的 top 评估为 TRUE 的事实。1=1 始终为真,因此您将获得表中的所有行。当然 location = 将过滤。

于 2013-05-04T21:49:03.903 回答
2

您可以简单地添加

or userInput in ('ALL','World','')

到您的 where 子句,其中 userInput 是用户的输入。

于 2013-05-04T19:55:28.563 回答
1

您的意思是您想根据用户输入的内容对要执行的查询应用一些规则。这超出了 SQL 的范围。

听起来您正在开发一个接受用户输入的应用程序。该应用程序的工作是检查该输入以确定对数据库运行什么 SQL 查询。因此,请检查您的输入并SELECT * FROM DATA在您的用户没有输入任何内容(“全部”或“世界”)的情况下执行操作。

于 2013-05-04T19:55:14.177 回答