Toon posts:

[TSQL] Middelste dimensie uit een nvarchar plukken

Pagina: 1
Acties:

Vraag


  • Supreme
  • Registratie: Oktober 2001
  • Laatst online: 10:00
Ik heb in mijn database een nvarchar veld genaamd [dimensies]. Hierin wordt als volgt een dimensie opgeslagen: '3,6 x 3,0 x 2,4'. Maar dit kan bijv ook '3,62 x 3,32 x 2,4' zijn. Dus soms 1 decimaal en soms 2.

Ik wil nu de middelste float eruit plukken om mee te rekenen. Dit is mij op zich gelukt alleen op een manier waarvan ik mij ten zeerste afvraag of het de meest efficiente manier is :+

code:
1
2
3
4
5
6
select 
[Dimensions],
CAST(REPLACE(SUBSTRING([Dimensions],CHARINDEX(' x ',[Dimensions])+3,CHARINDEX(' x ',[Dimensions],7)-(CHARINDEX(' x ',[Dimensions])+3)),',','.') as FLOAT)

from dump
where itemid = '999'


Dit werkt dus. Ik zoek eerst de eerste ' x ' en tel er 3 op, dat is mijn substring start positie. Dan zoek ik de tweede ' x ' en gebruik die om de lengte te bepalen voor de substring.

Nou was ik eerst begonnen met PATINDEX, maar dat lukte niet omdat ik geen goeie regex kon maken. Ik heb al met een regex tester zitten klooien maar ik heb daar te weinig ervaring mee.

Dus ik vroeg mij af of iemand hier nog een makkelijke of efficiëntere manier voor heeft :)

De data komt overigens uit een view, en het resultaat moet ik ook weer in een view verwerken. Dus ik kan niet alle SQL programming syntax gebruiken als bijv in een functie of een stored procedure.

Beste antwoord (via Supreme op 17-01-2023 19:57)


  • desmond
  • Registratie: Januari 2004
  • Niet online
Je kunt dingen op veel manieren oplossen, en ik heb heel vaak jouw methode gehanteerd. :) Lijkt mij okee. Regex is net zo slecht/goed leesbaar.
Over DataQuality.
ALTIJD komma als scheidingsteken?
ALTIJD '<spatie>x<spatie>' als scheidingsteken? -- beter zoeken naar x, dan (L en R) TRIM over de onderdelen.

Alle reacties


  • GarBaGe
  • Registratie: December 1999
  • Laatst online: 10:11
Als je in je SQL wilt rekenen met een deel van een samengesteld veld, dan moet je die delen los opslaan.
Dus niet 1 veld met dimensie.
Maar 3 velden met apart: lengte, breedte, hoogte.
Die kan je gelijk van het juiste type maken (decimal?), zodat je hier binnen je SQL direct operaties op kan loslaten.

Ryzen9 5900X; 16GB DDR4-3200 ; RTX-2080 ; 1TB SSD


  • Supreme
  • Registratie: Oktober 2001
  • Laatst online: 10:00
GarBaGe schreef op dinsdag 17 januari 2023 @ 10:16:
Als je in je SQL wilt rekenen met een deel van een samengesteld veld, dan moet je die delen los opslaan.
Dus niet 1 veld met dimensie.
Maar 3 velden met apart: lengte, breedte, hoogte.
Die kan je gelijk van het juiste type maken (decimal?), zodat je hier binnen je SQL direct operaties op kan loslaten.
Dat snap ik, als ik de DB zelf zou ontwerpen. Maar het is een veld uit een ERP database waar ik verder geen invloed op heb. Ik heb er een float van gecast waar ik nu vervolgens mee kan rekenen, dus dat is het probleem niet.

Ik wil weten of ik dat stukje uit die string makkelijker kan extracten. Omdat ik het idee heb dat ik het omslachtig heb gedaan :)

  • .KoenR
  • Registratie: Oktober 2012
  • Laatst online: 10:06
Een optie die je kan overwegen is een string_split cross apply:

code:
1
2
3
4
5
6
select 
[Dimensions],
TRY_CONVERT(FLOAT, trim(Dim.value))
from dump D 
  cross apply string_split(D.[Dimensions], "x", 1) as Dim
where D.itemid = '999' and Dim.ordinal = 2

  • KNed
  • Registratie: Juni 2006
  • Laatst online: 06:57
Mijn eerste gedachte is dat je zoiets sowieso met een Regex oplost. Maar ik weet niet of dat kan in de database/code omgeving waar je in werkt?

Edit: kan blijkbaar niet lees ik nu.

Kan je iets met een split / string_split functie?

[Voor 24% gewijzigd door KNed op 17-01-2023 10:29]


Acties:
  • Beste antwoord
  • +1Henk 'm!

  • desmond
  • Registratie: Januari 2004
  • Niet online
Je kunt dingen op veel manieren oplossen, en ik heb heel vaak jouw methode gehanteerd. :) Lijkt mij okee. Regex is net zo slecht/goed leesbaar.
Over DataQuality.
ALTIJD komma als scheidingsteken?
ALTIJD '<spatie>x<spatie>' als scheidingsteken? -- beter zoeken naar x, dan (L en R) TRIM over de onderdelen.

  • Supreme
  • Registratie: Oktober 2001
  • Laatst online: 10:00
desmond schreef op dinsdag 17 januari 2023 @ 14:41:
Je kunt dingen op veel manieren oplossen, en ik heb heel vaak jouw methode gehanteerd. :) Lijkt mij okee. Regex is net zo slecht/goed leesbaar.
Over DataQuality.
ALTIJD komma als scheidingsteken?
ALTIJD '<spatie>x<spatie>' als scheidingsteken? -- beter zoeken naar x, dan (L en R) TRIM over de onderdelen.
Thanks, met TRIM kan het inderdaad net iets netter :) Niet aan gedacht.
Pagina: 1


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee