1
1)我有串這樣的:如何爲後續編寫動態SQL?
vagalla AND suresh NOT employee OR industry
我想造成這樣的:
Name like '%vagalla%' and Name like '%suresh%' and not (Name like '%employee%' or description like '%industry4%')
2)我有串這樣的:
vagalla OR suresh AND employee OR industry
我想造成這樣的:
(Name like '%vagalla%' or Name like '%suresh%') and (Name like '%employee%' or Name like '%industry%')
下面是函數:
ALTER FUNCTION DBO.BOOLEANSEARCH(@SEARCHNME VARCHAR(50))
RETURNS VARCHAR(MAX)
AS
-- SELECT DBO.GETBOOLEANSEARCH ('VAGALLA SURESH')
BEGIN
DECLARE @QRY VARCHAR(MAX)
DECLARE @SEARCHSTRING VARCHAR(50)
DECLARE @START INT
DECLARE @END INT
SET @SEARCHSTRING = REPLACE(REPLACE(@SEARCHNME,'+' COLLATE LATIN1_GENERAL_CS_AI,'AND'),'-' COLLATE LATIN1_GENERAL_CS_AI,'OR')
SELECT @START = CHARINDEX('"',@SEARCHSTRING), @END = CHARINDEX('"',REVERSE(@SEARCHSTRING))
IF(@START = 1 AND @END = 1)
BEGIN
SELECT @QRY =' COLUMNNAME = '+ SUBSTRING(@SEARCHSTRING,2,LEN(@SEARCHSTRING)-2)
END
ELSE
BEGIN
IF ( ((1>(SELECT PATINDEX('% OR %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
OR (1>(SELECT PATINDEX('% AND %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
OR (1>(SELECT PATINDEX('% NOT %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
) AND ((SELECT CHARINDEX('*' COLLATE LATIN1_GENERAL_CS_AI,@SEARCHSTRING))>1))
BEGIN
SELECT @QRY= ' COLUMNNAME LIKE '+ REPLACE(@SEARCHSTRING,'*', '%')
END
ELSE IF ( ((1>(SELECT PATINDEX('% OR %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
OR (1>(SELECT PATINDEX('% AND %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
OR (1>(SELECT PATINDEX('% NOT %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
) AND ((SELECT CHARINDEX('*' COLLATE LATIN1_GENERAL_CS_AI,@SEARCHSTRING))<1))
BEGIN
SELECT @QRY= ' COLUMNNAME = ' + @SEARCHSTRING
END
ELSE
BEGIN
IF(1<(SELECT PATINDEX('% OR %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
BEGIN
SELECT @QRY =' COLUMNNAME LIKE %'+SUBSTRING(@SEARCHSTRING,1, PATINDEX('% OR %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)-1) +'%'
+' OR COLUMNNAME LIKE %'+ SUBSTRING(@SEARCHSTRING, PATINDEX('% OR %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)+3,LEN(@SEARCHSTRING))+'%'
END
ELSE IF(1<(SELECT PATINDEX('% AND %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
BEGIN
SELECT @QRY =' COLUMNNAME LIKE %'+SUBSTRING(@SEARCHSTRING,1, PATINDEX('% AND %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)-1) +'%'
+' AND COLUMNNAME LIKE %'+ SUBSTRING(@SEARCHSTRING, PATINDEX('% AND %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)+4,LEN(@SEARCHSTRING))+'%'
END
ELSE IF(1<(SELECT PATINDEX('% NOT %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)))
BEGIN
SELECT @QRY =' COLUMNNAME LIKE %'+SUBSTRING(@SEARCHSTRING,1, PATINDEX('% NOT %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)-1) +'%'
+' AND COLUMNNAME NOT LIKE %'+ SUBSTRING(@SEARCHSTRING, PATINDEX('% NOT %', @SEARCHSTRING COLLATE LATIN1_GENERAL_CS_AI)+4,LEN(@SEARCHSTRING))+'%'
END
---HERE I NEED TO IMPLEMENT THE OTHER CONDITION
END
END
RETURN @QRY
END
嗨,歡迎來到Stack Overflow。你試圖把自己放在一起?結果是什麼?爲什麼你的結果不令人滿意? –
我仍然不確定你嘗試過什麼。你是否直接在sql-server中輸入上述內容,或者是在你編寫的代碼中使用了哪個「字符串」? (如果是這樣,請包含代碼)當您嘗試在sql-server中使用「result like」部分時發生了什麼?他們沒有給你想要的結果嗎? –
問題和答案格式如上。請求發佈結果。 –