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”部分时发生了什么?他们没有给你想要的结果吗? –
问题和答案格式如上。请求发布结果。 –