[英]SQL wildcard issue
我有一個數據庫,可以由我們的用戶通過界面進行修改。 對於一個字段(companyID),它們應該能夠在字符串中將星號作為通配符放置。
例如,他們可以使用G378 *來代表以G378開頭的任何公司ID。
現在,在我的客戶端程序中,我提供了一個“完整”的companyID作為參數:
SELECT * FROM table WHERE companyID = '" + myCompanyID + "'
但我必須檢查通配符,有什么我可以添加到我的查詢來檢查這一點。 我不確定如何解釋它,但它有點像我習慣的那樣倒退。 我可以修改我提供的值(完整的companyID)以匹配查詢本身中的通配符值嗎?
我希望這是一種感覺。
謝謝!
編輯:用戶沒有使用SELECT
。 用戶只使用INSERT
或UPDATE
而THEY是將*放在字段中的用戶。 我的程序使用SELECT
,我只有完整的companyID(沒有星號)。
這是一個經典的SQL注入目標! 你應該很高興你現在找到它。
回到你的問題,當用戶輸入'*'
,將其替換為'%'
,並在查詢中使用LIKE
而不是=
。
例如,當最終用戶輸入"US*123"
,請運行以下查詢:
SELECT * FROM table WHERE companyID LIKE @companyIdTemplate
將@companyIdTemplate
參數設置為"US%123"
,然后運行查詢。
我在示例中使用了.NET的@
,但查詢參數以特定於您的托管語言的方式表示。 例如,他們成了?
在Java中。 檢查任何關於使用參數化查詢的DB編程教程,以了解它在系統中的完成情況。
編輯:如果您想基於指定另一個表中的記錄的通配符執行插入,您可以執行insert-from-select,如下所示:
INSERT INTO CompanyNotes (CompanyId, Note)
SELECT c.companyId, @NoteText
FROM Company c
WHERE c.companyId LIKE 'G378%'
這將為具有ID匹配"G378%"
每個公司將具有@NoteText
參數值的記錄插入到CompanyNotes
表中。
這在某種程度上依賴於實現,您沒有提到您正在處理的SQL類型。 但是,查看MS SQL Server通配符包括%(對於任意數量的字符)或_(對於單個字符)。 通配符僅在與“like”一起使用時才被評估為通配符,而不是= =。 但是你可以傳入一個包含通配符的參數,只要你使用“喜歡”就可以將它評估為通配符
在TSQL中我會使用replace和like。 即:
select * from table where companyid like replace(mycompanyid,'*','%');
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.