webForumDet fria alternativet

Regexp i MSSQL

7 svar · 220 visningar · startad av Web-Tor

Web-TorMedlem sedan nov. 200011 794 inlägg
#1

Jag använder det här till MySQL:

$result = mysql_query("SELECT kol FROM tabell WHERE kol REGEXP '^(<[^>]*>|[^<])*[^<]*$SearchWord'") or die ("Fel");

Hur får man det att funka med MSSQL?

LarsGMedlem sedan dec. 200012 465 inlägg
#2

Om jag tolkar ditt regexp rätt så går det inte att få till med T-sql.

Det som finns är like som dock bara innehåller en bråkdel av de funktioner som finns i regexp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ca-co_5t9v.asp

Om du har SQL server 2000 så kan du skriva en funktion som kontrollerar om värdet uppfyller villkoret.

Web-TorMedlem sedan nov. 200011 794 inlägg
#3

Aj! Det var inte bra. :(

Om du har SQL server 2000 så kan du skriva en funktion som kontrollerar om värdet uppfyller villkoret.

Är det svårt? Jag har inte jobbat med MSSQL tidigare.

Web-TorMedlem sedan nov. 200011 794 inlägg
#4

Jag fick förslaget från en kollega att man kanske kunde använda "subselects". Jag har aldrig gjort det så jag har ingen aning om det skulle funka. Kanske nåt i stil med det här skulle fungera:

{
 SELECT * FROM tabell WHERE kolumn LIKE %Sökord% [i]men inte[/i]

 {
 &nbsp; SELECT [i]allt som står inom taggar[/i]
 }

}

:q

LarsGMedlem sedan dec. 200012 465 inlägg
#5

otestad kod

Det problem som man inte kan kontrollera med like är om det finns noll eller flera förkomster av en sträng.

Som jag ser det så måste du titta på tecken för tecken och hålla reda på status (t.ex. om du har hittat < men ingen > är en viss status.)

create function wt_regexp(@str varchar(200),@search varchar(30)) returns int
as
begin
declare @l,@p,@s int
select @l = len(str), @p = 1,@s = 0
while @p <= @l
begin
    if substring(@str,@p,1) = '<' @s = @s + 1
    else if substring(@str,@p,1) = '>' @s = @s - 1
    else if @s = 0 and 
           substring(@str,@p,len(@search)) = @search return 1
    set @p = @p + 1
end
return 0

I princip alltså (jag har inte kollat alla detaljer i ditt regexp)

sen så kan du använda

$q= "SELECT kol FROM tabell WHERE wt_REGEXP(kol,'$SearchWord' > 0") or die ("Fel");

Det är enklare att plocka upp all data till PHP och använda eregi_test. Det kanske går på ett ut prestandamässigt eftersom Tsql-funktionen inte kan bli speciellt effektiv.

Det blir ju olika kod för olika DBMS, men jag ser inte hur du kan undvika det i alla fall.

LarsGMedlem sedan dec. 200012 465 inlägg
#6

Det där med subselect får jag inte till riktigt

Om du söker efter 'nisse' i en kolumn med värdet

'<nisse> nisse'

så skall du väl få träff? Eller kan värdena i kolumnen bara se ut enligt vissa mönster?

Web-TorMedlem sedan nov. 200011 794 inlägg
#7

Om du söker efter 'nisse' i en kolumn med värdet

'<nisse> nisse'

så skall du väl få träff?

Helt riktigt! Du ska få träff (men inte på det nisse som står inom hakar).

Det där med subselects var bara en chansning. ;)

Web-TorMedlem sedan nov. 200011 794 inlägg
#8

Jag lyfter upp den här frågan.

Om du har SQL server 2000 så kan du skriva en funktion som kontrollerar om värdet uppfyller villkoret.

Hur gör jag detta?
Har inte jobbat med SQL-server 2000 tidigare. ;)

Genererad på 383 ms · cache AV · v20260730165559-full.f96bc7eb