webForumDet fria alternativet

Plocka bort allt som inte är numeriskt

Databaser & SQL

17 svar · 951 visningar · startad av devotion

Medlem sedan jan. 20013 582 inlägg
Frågan#1

Hej!

Kan man i SQL.server göra om en sträng som ser ut så här:

Avtal wee 450

till bara

450

Mvh
Henrik

Medlem sedan dec. 20025 483 inlägg
#2

I en SELECT utan några krusiduller? Tveksamt. Det blir nog till att skapa en UDF.

Medlem sedan jan. 20013 582 inlägg
#3

Hur skulle en sådan UDF se ut? :)

Mvh Henrik

Medlem sedan nov. 20014 054 inlägg
#4

Vet inte om SQL server stödjer regexp, men man kan ju skriva udf:er i ex. .NET som man sedan kan använda sig av.

alternativt kan man ju kanske, om man vet hur strängen kommer att se ut, ex. ser den alltid ut ex: Avtal wee 12313, dvs 2 mellanslag och två stringar och en int typ..

så kan man kanske splita mellanslagen, och ta sista värdet i den splitade strängen, annars kan ju kolla upp .net i samband med UDF i Sql server, ex: http://www.eggheadcafe.com/articles/sql_server_2005_clr_regex.asp

Medlem sedan jan. 20013 582 inlägg
#5

Fredde Mannen skrev:

Vet inte om SQL server stödjer regexp, men man kan ju skriva udf:er i ex. .NET som man sedan kan använda sig av.

alternativt kan man ju kanske, om man vet hur strängen kommer att se ut, ex. ser den alltid ut ex: Avtal wee 12313, dvs 2 mellanslag och två stringar och en int typ..

så kan man kanske splita mellanslagen, och ta sista värdet i den splitade strängen, annars kan ju kolla upp .net i samband med UDF i Sql server, ex: http://www.eggheadcafe.com/articles/sql_server_2005_clr_regex.asp

Det bästa hade ju varit en regexp, eftersom det inte finns något givet mönster i strängen, förutom att jag vill få ut det numeriska värdet... :)

Får fundera lite på det.

Mvh
Henrik

Medlem sedan jan. 20013 582 inlägg
#6

Skulle man kunna göra det i Excel? Datat kommer ju därifrån.... :)

Medlem sedan nov. 20014 054 inlägg
#7

devotion skrev:

Skulle man kunna göra det i Excel? Datat kommer ju därifrån.... :)

http://www.tanguay.info/web/codeExample.php?id=908
http://www.vbaexpress.com/kb/getarticle.php?kb_id=68

Man bör kunna göra en regexp i Excell så.. :) Man kan ju alltid pröva..

Medlem sedan mars 20007 896 inlägg
#8

Du kan ju alltid skapa en funktion;
http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2313798&SiteID=17
eller:
http://xpscodes.com/2008/04/15/remove-strip-characters-from-alphanumeric-data

SQL Server stödjer reguljära uttryck, men om man kan använda den på utplockade fält och inte bara på jämförelser får du fråga någon annan. ;)

Medlem sedan jan. 20013 582 inlägg
#9

Hej igen!

Jag tittade lite mer på denna:

Create FUNCTION [dbo].[ufnFormatContractNumber](
@contractno varchar(20)
)
RETURNS varchar(20)
AS
BEGIN
Return (Select SUBSTRING(@contractno, n, 1)
from (SELECT number n FROM master.dbo.spt_values
WHERE type = 'p'
AND number BETWEEN 1 AND len(@contractno)
) AS Nums
where SUBSTRING(@contractno, n, 1) like '[0-9]'
for xml path(''))
END;

men vet inte riktigt hur jag ska tillämpa den...

Tabellen heter tblCustomer och fältet heter Custom2

Mvh
Henrik

Medlem sedan nov. 20014 054 inlägg
#10

om nu funktionen är skapad, anropas den på föjande sätt

dbo.ufnFormatContractNumber(...)

hur hade du tänkt att den skall användas.. vad är syftet mer än just få ut siffrorna.

Medlem sedan jan. 20013 582 inlägg
#11

Jag har en sträng som innehåller tex

123 on call

123 är ett avtalsnummer och "on call" är avtalstypen

Jag vill därför lyfta ut detta och lägga i ett annat fält; Custom4

Mvh
Henrik
:)

Medlem sedan jan. 20013 582 inlägg
#12

Löste det med Vb-script och regexp,,, :)

Mvh
Henrik

Medlem sedan aug. 20011 346 inlägg
#13

devotion skrev:

Löste det med Vb-script och regexp,,, :)

Mvh
Henrik

Hur? :) behöver samma sak ungefär

Medlem sedan jan. 20013 582 inlägg
#14

Så här:

'
Option explicit
'
Sub main()

	dim Conn, sSQL, Rs
	dim sString, sContractNr, lId

	'Öppna databasen
	Set Conn=CreateObject("ADODB.Connection")
	Conn.Open Application.sDbConnectionString
	
	Set Rs=CreateObject("ADODB.Recordset")
	
	'SQL-fråga
	sSQL= "SELECT tblCustomer.Custom2, tblCustomer.[Id]" _
		& " FROM [tblCustomer]"

	Rs.Open sSQL, Conn
	
	while not rs.EOF
	
		sString = Rs("Custom2")
		sContractNr = GetContractNr(sString)
		lId = Rs("Id")

		sSQL= "UPDATE [tblCustomer] SET [Modified] = GetDate(), [Custom4] = '" & sContractNr & "' WHERE [Id] = " & lId & ""
		Conn.Execute sSQL
		rs.MoveNext
	wend
	
	msgBox "Klart"
	
	Rs.Close
	Set Rs=Nothing
	Set Conn=Nothing

	Call Refresh()
	
End sub

'Funktion för att hämta kontraktsnummer
Function GetContractNr(str)
	with new regExp
		.pattern = "[^\d]+"
		.IgnoreCase = True
		.Global = True
		GetContractNr = .Replace(str, "")
	End With

End Function

Mvh
henrik

Medlem sedan apr. 2006409 inlägg
#15

OT: Jag blev nyfiken på tabellstrukturen, var har du: Avtal wee 450

Medlem sedan jan. 20013 582 inlägg
#16

überfuzz skrev:

OT: Jag blev nyfiken på tabellstrukturen, var har du: Avtal wee 450

Just den strängen var bara ett exempel,

Tanken var att ta bort allt som inte var ett numeriskt tal.

Dvs spara 450 i exemplet.

:)

Medlem sedan apr. 2006409 inlägg
#17

Jag frågade mest för att jag inte förstod i vilket sammanhang man har siffror i en sträng när man behöver siffrorna som siffror. Alltså, att någon sparar VOLVO 142 DL i en databas kan jag förstå, men det du frågade efter gjorde mig förbryllad.

Medlem sedan aug. 20011 346 inlägg
#18

ja, nu var det ju regexp jag var intresserad av i exemplet då, det var det jag citerade :)

256 ms totalt · 4 externa anrop · v20260731065814-full.e96017d9
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)