webForumDet fria alternativet
Logga in / Bli medlem

Regexp i MSSQL

Databaser & SQL

7 svar · 220 visningar · startad av Web-Tor

Medlem sedan nov. 200013 890 inlägg
Frågan#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?

Medlem sedan dec. 200012 464 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.

Medlem sedan nov. 200013 890 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.

Medlem sedan nov. 200013 890 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

Medlem sedan dec. 200012 464 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.

Medlem sedan dec. 200012 464 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?

Medlem sedan nov. 200013 890 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. ;)

Medlem sedan nov. 200013 890 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. ;)

371 ms totalt · 4 externa anrop · v20260731065814-full.14655e19
128 ms — deklarationer (db)
118 ms — hämta statistik (db)
123 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)