我在 SQL 中有以下函式,我曾經從我網站上的搜索頁面獲取 varchar“查詢”字串。它將字串引數拆分為臨時表,其中包含該查詢中所有單詞的串列。但是,我希望能夠讓用戶通過將單詞括在引號中來搜索短語。所以一個階段基本上會被認為是我回傳的臨時表中的一個詞。所以基本上它現在的作業方式,如果你搜索“Gold TV”4K,它會回傳類似的東西
- “金子
- 電視”
- 4K
我希望它回來
- 黃金電視
- 4K
我一直無法獲得正確的邏輯,這是我當前的功能。或者如果有更好的方法來做到這一點,請告訴我。
CREATE FUNCTION [dbo].[querySplit](@String varchar(8000), @Delimiter char(1))
returns @temptable TABLE (items varchar(8000))
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(@Delimiter,@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(@slice)
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
uj5u.com熱心網友回復:
使用輔助函式和 CROSS APPLY
例子
Declare @S varchar(max) = 'Max "Gold TV" 4K Ultra'
Select Parsed = coalesce(B.RetVal,replace(A.RetVal,'"',''))
From [dbo].[tvf-Str-Parse](replace(replace(' ' @S ' ',' "','|"'),'" ','"|'),'|') A
Cross Apply [dbo].[tvf-Str-Parse] (case when A.RetVal like '%"%' then null else A.RetVal end,' ') B
Where A.RetVal is not null
Order By A.RetSeq,B.RetSeq
結果
Parsed
Max
Gold TV
4K
Ultra
由于您在 2014 年,這是我的拆分/決議功能
CREATE FUNCTION [dbo].[tvf-Str-Parse] (@String varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select RetSeq = row_number() over (order by 1/0)
,RetVal = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' replace((Select replace(@String,@Delimiter,'§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>') '</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
uj5u.com熱心網友回復:
這是經過一些調整的 UDF。
CREATE FUNCTION [dbo].[querySplit] ( @String VARCHAR(8000), @Delimiter CHAR(1) ) RETURNS @Tbl TABLE (items VARCHAR(8000)) WITH SCHEMABINDING AS BEGIN DECLARE @idx INT; DECLARE @slice VARCHAR(8000); SET @idx = 1; IF LEN(@String)<1 OR @String IS NULL RETURN; WHILE @idx != 0 BEGIN IF LEFT(@String,1) = '"' BEGIN SET @String = STUFF(@String, 1, 1, ''); SET @idx = CHARINDEX('"', @String, 2); END ELSE SET @idx = CHARINDEX(@Delimiter, @String); IF @idx != 0 SET @slice = LEFT(@String, @idx-1); ELSE SET @slice = @String; IF (LEN(@slice)>0) INSERT INTO @Tbl (Items) VALUES (@slice); SET @String = RIGHT(@String, LEN(@String) - @idx); IF LEN(@String) = 0 break; END RETURN; END
select quotename(items) from dbo.querySplit('"Diamond 3D Goggles" "5 inch×2"', ' ')
(無列名) [鉆石3D護目鏡] 【5寸×2】
關于db<>fiddle 的演示在這里
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399919.html
標籤:sql sql-server 查询语句
下一篇:未使用“洗掉表”洗掉的本地臨時表
