2015-06-09 3 views
0

Может ли кто-нибудь дать мне решение моей проблемы?Динамически добавлять похожие операторы, где статья

У меня есть массив строк максимальной длины. Я хочу сравнить все мои элементы массива строк с одним SQL-запросом. Как я могу это сделать?

string[] new = searchtext; 
select Qid from questions where qdescriptions like string[0],string[1],string[2] 

Длина массива строк не фиксирована, она динамична.

Ex: моя строка поиска "админ ошибка Логин"

Тогда я разделил, что в

admin 
login 
error 

как три части. Мой ожидаемый результат должен содержать все эти три строки в базе данных

Как это

Admin post this; 
password change for login; 
the error database; 

Надеюсь, вы понимаете. Результаты должны содержать все мои строки поиска в одном поисковом запросе ..

C# код:

public void searchdetails(string[] searchwords) { 
    SqlConnection con = new SqlConnection(); 
    con.ConnectionString = connection; con.Open(); 

    string[] soldesc = searchwords; 
    int i = 0; 

    if (soldesc.Length == 1) { 
     string query1 = "select Qid from Questions where Qdescription like '% " + soldesc[i] + " %'"; 
    } 

    SqlCommand cmds = new SqlCommand(query1, con); cmds.ExecuteNonQuery(); 
+3

Просьба представить некоторые подробности –

+0

выглядят сейчас ..ii обновили – nanthakumar

+0

Вам понадобится LIKE за строку, поместите OR между LIKE. – jarlh

ответ

0

Вы можете сделать это при помощи динамического создания вашего запроса:

string[] new = searchtext; 
String query = "select Qid from questions"; 

Написать цикл в приложении, что петли через поиск массива: псевдокоде входящий:

For(String searchstring in new){ 
    if(new.indexof(searchstring) === 0){ 
     query += " where qdescriptions like " + searchstring; 
    } 
    else{ 
    //depending on what you want to do here use OR or AND 
     query += " or qdescriptions like " + searchstring; 
    } 

} 

result = query.execute(); 

Примечание: это псевдо-код, видя, что вы не сказали, какой язык программирования и т. д. вы используете. Я не могу сказать вам, какой будет синтаксис для цикла for или как защитить ваш запрос от sqlInjection.

Ваш C# код должен выглядеть примерно так:

public void searchdetails(string[] searchwords) { 
    SqlConnection con = new SqlConnection(); con.ConnectionString = connection; 
    con.Open(); 
    string[] soldesc = searchwords; 
    string query1 = "select Qid from Questions"; 
    For(int i = 0; i<soldesc.Length;i++){ 
     if (i == 0) { 
     query1 += "where Qdescription like '%" + soldesc[i] + "%'"; 
     } 
     else{ 
     query1 += " AND Qdescription like '%" + soldesc[i] + "%'"; 
     } 
    } 


SqlCommand cmds = new SqlCommand(query1, con); cmds.ExecuteNonQuery(); 
+0

jeremy, что именно вы разместили, я попытался ... но проблема в том, что мне нужно разделить строку поиска с пробелом, тогда мне нужно применить подобное условие для всех расщепленных строк. что расщепленные строки могут меняться каждый раз. Вы можете помочь мне в этом сценарии. – nanthakumar

+0

не могли бы вы привести пример в свой пост (используйте функцию редактирования, добавьте пример данных и добавьте ожидаемый результат) –

+0

проверить это сейчас jeremy – nanthakumar

2

Попробуйте

declare @searchtext nvarchar(max) = 'abc,def,pqr' 

создать функцию

CREATE FUNCTION [dbo].[fn_Split](@text varchar(8000), @delimiter varchar(20)) 
RETURNS @Strings TABLE 
( 
    position int IDENTITY PRIMARY KEY, 
    value varchar(8000) 
) 
AS 
BEGIN 

DECLARE @index int 
SET @index = -1 

WHILE (LEN(@text) > 0) 
    BEGIN 
    SET @index = CHARINDEX(@delimiter , @text) 
    IF (@index = 0) AND (LEN(@text) > 0) 
     BEGIN 
     INSERT INTO @Strings VALUES (@text) 
      BREAK 
     END 
    IF (@index > 1) 
     BEGIN 
     INSERT INTO @Strings VALUES (LEFT(@text, @index - 1)) 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
     END 
    ELSE 
     SET @text = RIGHT(@text, (LEN(@text) - @index)) 
    END 
    RETURN 
END 

Запрос

select * from yourtable y inner join (select value from 
fn_split(@searchtext,',')) as split on y.qdescriptions like '%+split.value+%' 
+0

Для чего это dbms? (Обратите внимание, что вопрос не имеет указанных dbms.) – jarlh

+0

для Sql-сервера –

0

В C#, вы можете создать текст запроса, как это ...

public static void Main() 
{ 
    string final = GenerateParameters("tableName", "fieldName", new[] {"admin", "login", " error"}); 

    // execute query 
    // final = "SELECT * FROM tableName WHERE fieldName LIKE '%admin%' OR fieldName LIKE '%login%' OR fieldName LIKE '% error%'" 
} 

static string GenerateParameters(string tableName, string fieldName, IEnumerable<string> searchTerms) 
{    
    string sqlParameters = string.Join(" OR ", searchTerms.Select(x => "{0} LIKE '%{1}%'".FormatWith(fieldName, x))); 
    return "SELECT * FROM {0} WHERE ".FormatWith(tableName) + sqlParameters;    
} 

public static class StringExtensions 
{ 
    public static string FormatWith(this string value, params object[] args) 
    { 
     return String.Format(value, args); 
    } 
}