Toon posts:

[TSQL] Middelste dimensie uit een nvarchar plukken

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
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 Verwijderd 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


Acties:
  • +2 Henk 'm!

  • GarBaGe
  • Registratie: December 1999
  • Nu online
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-4080S ; 7TB SSD


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
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 :)

Acties:
  • +2 Henk 'm!

  • .KoenR
  • Registratie: Oktober 2012
  • Laatst online: 01-10 12:36
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

Acties:
  • +1 Henk 'm!

  • KNed
  • Registratie: Juni 2006
  • Laatst online: 08:27
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
  • +1 Henk '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.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
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