Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据用户输入获取SQL中的所有记录_Sql_Sql Server - Fatal编程技术网

根据用户输入获取SQL中的所有记录

根据用户输入获取SQL中的所有记录,sql,sql-server,Sql,Sql Server,我正在学习SQL,遇到了一个困难。我的数据表如下所示 DBO数据 Id | Name | Surname | Title | Location ---------------------------------------- 1 | xxx | abc | def | London 2 | xxx | abc | def | Oslo 3 | xxx | abc | def | New York 现在我想获取id、姓名、头衔和姓氏,我使用

我正在学习SQL,遇到了一个困难。我的数据表如下所示

DBO数据

Id | Name | Surname | Title  | Location
----------------------------------------
1  | xxx  | abc     | def    | London
2  | xxx  | abc     | def    | Oslo
3  | xxx  | abc     | def    | New York
现在我想获取id、姓名、头衔和姓氏,我使用如下查询:

SELECT 
    Id, Name, Surname, Title 
FROM 
    DATA 
WHERE 
    Location = 'London' -- (this is user input)
但如果用户在
WHERE
子句中输入
All
World
或空字符串,我会遇到问题,我希望查询返回所有行。可以通过编写另一个查询来处理上述特殊情况吗


我将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>`

我知道我可以在应用程序端完成这项工作,但如果查询本身能够做到这一点,我只是好奇而已。

你的意思是,你想根据用户输入的内容应用一些规则来执行什么查询。这超出了SQL的范围


听起来您正在开发一个从用户那里获取输入的应用程序。该应用程序的任务是检查该输入,以确定对数据库运行哪个SQL查询。因此,请检查您的输入,如果您的用户未输入任何内容,请执行
从数据中选择*

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

听起来您正在开发一个从用户那里获取输入的应用程序。该应用程序的任务是检查该输入,以确定对数据库运行哪个SQL查询。因此,请检查您的输入并执行
从数据中选择*
,如果您的用户未输入任何内容,“全部”或“世界”。

您只需添加

or userInput in ('ALL','World','')
在where子句中,where userInput是来自用户的输入。

您只需添加

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

对于where子句,其中userInput是来自用户的输入。

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

SELECT 
    Id, Name, Surname, Tittle 
FROM 
    data 
WHERE 
    Location = <input> OR
    <input> in ('All', 'World', '')
选择
身份证、姓名、姓氏、头衔
从…起
资料
哪里
位置=或
在(‘所有’、‘世界’、’)中

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

SELECT 
    Id, Name, Surname, Tittle 
FROM 
    data 
WHERE 
    Location = <input> OR
    <input> in ('All', 'World', '')
选择
身份证、姓名、姓氏、头衔
从…起
资料
哪里
位置=或
在(‘所有’、‘世界’、’)中

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

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
选择
身份证、姓名、姓氏、头衔
从…起
资料
哪里
案例
当=全部时,则1=1
当='World'时,则1=1
其他位置=
结束

其工作原理是,它利用了每个谓词(实际上是where子句)的top evaluate为TRUE这一事实。1=1始终为真,因此您将获得表中的所有行。当然location=will filter。

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

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
选择
身份证、姓名、姓氏、头衔
从…起
资料
哪里
案例
当=全部时,则1=1
当='World'时,则1=1
其他位置=
结束


其工作原理是,它利用了每个谓词(实际上是where子句)的top evaluate为TRUE这一事实。1=1始终为真,因此您将获得表中的所有行。当然location=will filter。

这可能应该在应用程序端完成。您从哪里调用此SQL@Scotch是对的,这应该在应用程序中完成,而不是在数据库中。另外,永远不要相信用户输入。这可能会导致不必要的结果:准备好的语句通常是解决这个问题的方法。我会在DB中这样做。这是一个简单的查询,避免在多个位置之间混合数据逻辑。这可能应该在应用程序端完成。您从何处调用此SQL@Scotch是对的,这应该在应用程序中完成,而不是在数据库中。另外,永远不要相信用户输入。这可能会导致不必要的结果:准备好的语句通常是解决这个问题的方法。我会在DB中这样做。这是一个简单的查询,避免了在多个位置之间混合数据逻辑。我将ASP.net与这样的数据源一起使用。实际上,在他的情况下,您的查询应该类似于
从数据中选择ID、姓名、姓氏、标题。
。这是一个品味问题。有些人费心显式指定列,只是为了排除单个列。我个人认为这是毫无意义的。同时获取location列不太可能导致问题,但会创建一个更短、更可读的查询。我知道我可以在应用程序中执行此操作,但想知道是否可以在SQL查询本身中实现。正如alecxe建议的那样,您可以应用另一种条件,但我认为这是一种不好的做法。你不应该在查询中使用这种逻辑,也不应该在查询字符串中插入用户输入。我使用ASP.net和这样的数据源实际上,在他的情况下,你的查询应该类似于从数据中选择ID、姓名、姓氏和标题。这是一个品味问题。有些人费心显式指定列,只是为了排除单个列。我个人认为这是毫无意义的。同时获取location列不太可能导致问题,但会创建一个更短、更可读的查询。我知道我可以在应用程序中执行此操作,但想知道是否可以在SQL查询本身中实现。正如alecxe建议的那样,您可以应用另一种条件,但我认为这是一种不好的做法。您不应该将这种逻辑放入查询中,也不应该将用户输入插入查询字符串中。不,CASE的THEN子句在SQL Server中不能有布尔表达式。不,CASE的THEN子句在SQL Server中不能有布尔表达式。