2013-05-04 70 views
1

我剛剛學習SQL並遇到了一些困難。我的數據表看起來像這樣根據用戶輸入獲取SQL中的所有記錄

DBO DATA

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) 

,但我得到問題如果用戶輸入AllWorldWHERE子句中的空字符串,我希望查詢返回所有行。是否有可能通過編寫另一個查詢來處理上述特殊情況?

我使用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 

我知道我可以做這個應用程序端,但我只是好奇,如果這可能在查詢本身。

+3

這應該可能是應用程序端。 – Scotch 2013-05-04 19:54:14

+1

你從哪裏調用這個SQL? @Scotch是正確的,這應該在你的應用程序中完成,而不是在你的數據庫中完成。 – cyroxx 2013-05-04 19:55:09

+2

另外,不要信任用戶輸入。這可能會導致不必要的結果:http://xkcd.com/327/準備好的語句通常是解決此問題的方法。 – cyroxx 2013-05-04 19:57:19

回答

2

如果你真的想這樣做,在您的查詢,試試這個:

SELECT 
    Id, Name, Surname, Tittle 
FROM 
    data 
WHERE 
    Location = <input> OR 
    <input> in ('All', 'World', '') 
1

你在說什麼是你想要根據用戶輸入什麼查詢來執行什麼查詢。這超出了SQL的範圍。

這聽起來像你正在開發一個應用程序,從用戶接受輸入。該應用程序的工作是檢查該輸入以確定針對數據庫運行的SQL查詢。因此,請檢查您的輸入,並在用戶輸入「all」或「world」時輸入SELECT * FROM DATA

+0

我正在使用這樣的數據源的ASP.net – 2013-05-04 20:23:55

+0

實際上,在他的情況下,您的查詢應該像'SELECT ID,NAME,SURNAME,TITLE FROM DATA'。 – 2013-05-04 20:25:12

+0

這是一個品味問題。有些人打擾明確指定列只是排除一列。就我個人而言,我認爲這是毫無意義的。獲取位置列也不太可能導致問題,但會創建一個更簡單的可讀查詢。 – 2013-05-04 20:30:29

2

您可以簡單地添加

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

你的where子句,其中userInput是來自用戶的輸入。

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子句)具有最高評價爲TRUE。 1 = 1始終爲真,因此您將獲得表中的所有行。當然location =會過濾。

+0

不,CASE的THEN子句在SQL Server中不能有布爾表達式。 – 2013-05-04 22:22:11

相關問題