Avatar billede anders_cp Nybegynder
16. december 2008 - 17:10 Der er 6 kommentarer og
1 løsning

Maks integer i varchar-felt

Hej
Med min noget kryptiske titel menes der at jeg skal have fundet to (maks)-felter fra et syndigt rod af forskellige datatyper i en varchar(50)-datafelt. Eksempler på data.


Tabelnavn: PartReturn

PackageID
NULL
NULL
NULL
NULL
103239
103239
103238
V000488
V000488
V000488
V000488
V000488
V000488
V000488
NULL
V000488
NULL
A000103
A000103
NULL
salg
NULL

Således ser feltet desværre ud. Jeg ønsker at finde to tal gerne i samme forespørgsel, men ikke strengt nødvendigt.
1) den maksimale integerværdi. Som her er: 103239
2) den maksimale Vxxxx-værdi. Som her er: V000488

Hvis det kan hjælpe er det det sidst ankomne tal af henholdsvis 1) og 2) som ønskes.

Har prøvet at konvertere og alt muligt, men uden held, så derfor søger jeg hjælp hos jer Eksperter ;)
Avatar billede arne_v Ekspert
16. december 2008 - 17:18 #1
Lav det i app fremfor i SQL, laes data ind som VARCHAR, test for om det er et
tal og haandter derefter.
Avatar billede arne_v Ekspert
16. december 2008 - 17:20 #2
Hvis du insisterer paa SQL saa proev:

SELECT MAX(CASE WHEN PATINDEX('[^0-9]', packageid) = 0 THEN CAST(packageid AS INTEGER) ELSE -1) FROM partreturn
Avatar billede anders_cp Nybegynder
17. december 2008 - 00:03 #3
Jeg får en fejl på dit sql-forslag:
SELECT
MAX(CASE WHEN PATINDEX('[^0-9]', PackageID) = 0
THEN
CAST(PackageID AS INTEGER)
ELSE -1)
FROM PartReturns

Msg 170, Level 15, State 1, Line 5
Line 5: Incorrect syntax near ')'.

Jeg havde egentlig ikke tænkt over at hive tallene ind og ordne sorteringen i appl.
Er det designmæssigt/ydelsesmæssigt det "rigtige", eller...?


Tabellen er temmelig stor (114.000 rækker)

Måske skulle jeg nedtage de første 100 (så er sandsynligheden stor for at der fåes fat i begge typer packageID'er. Ville det være en løsning?


Nedenstående giver mig det rigtige nummer for Vxxxx
SELECT TOP 1 PackageID
FROM PartReturns
WHERE PackageID LIKE 'V%'

Nu mangler jeg bare for det største TAL, men måske din sql kan løse dette., eller jeg skal hente de 100 første (jvnfør dit forslag om at få tallet frem i applikationen):
SELECT TOP 100 PackageID FROM PartReturns ORDER BY DateTimeStamp DESC
Avatar billede arne_v Ekspert
17. december 2008 - 01:18 #4
Jeg tror at der mangler en END.

SELECT MAX(CASE WHEN PATINDEX('[^0-9]', packageid) = 0 THEN CAST(packageid AS INTEGER) ELSE -1 END) FROM partreturn
Avatar billede anders_cp Nybegynder
17. december 2008 - 14:54 #5
Det må siges at være svar på mit spørgsmål.
Jeg kendte sørme ikke PATINDEX - men det gør jeg nu ;)

For god ordens skyld er her det færdige resultat - jeg ved ikke om det er en usmart løsning:

SELECT MAX(CASE WHEN PATINDEX('%[^0-9]%', packageid) = 0
THEN CAST(packageid AS INTEGER) ELSE -1 END) AS Result1,

(SELECT TOP 1 PackageID
FROM PartReturns
WHERE PackageID LIKE 'V%'
ORDER BY DateTimeStamp DESC
) AS Result2

FROM PartReturns
WHERE DateTimeStamp > (GETDATE() - 60)
Avatar billede anders_cp Nybegynder
17. december 2008 - 14:54 #6
Så du må gerne lægge et svar.
Avatar billede arne_v Ekspert
17. december 2008 - 14:57 #7
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester