Permalänk
Medlem

regex sql db

Hej,

Jag skulle vilja veta hur man kan göra ett byte med hjälp av reguljära uttryck i sql?, jag hittar nämligen ingen bra lösning på nätet.

Tanken är att byta strängen item.id innan den gör en match "(UPPER(item.id)) = (UPPER(custom.id))", med exempelvis detta reguljära utryck, för att sortera bort alla special tecken:

(\s*)[^a-zA-Z0-9 ]

Så här ser min implementering ut i sql:

c.execute(' SELECT DISTINCT item.id from items as item INNER JOIN custom_url AS custom ON (UPPER(item.id)) = (UPPER(custom.id)) WHERE source=? AND visible=? ORDER BY weight ', [self.source.KEY, True])

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Hej,

Jag skulle vilja veta hur man kan göra ett byte med hjälp av reguljära uttryck i sql?, jag hittar nämligen ingen bra lösning på nätet.

Tanken är att byta strängen item.id innan den gör en match "(UPPER(item.id)) = (UPPER(custom.id))", med exempelvis detta reguljära utryck, för att sortera bort alla special tecken:

(\s*)[^a-zA-Z0-9 ]

Så här ser min implementering ut i sql:

c.execute(' SELECT DISTINCT item.id from items as item INNER JOIN custom_url AS custom ON (UPPER(item.id)) = (UPPER(custom.id)) WHERE source=? AND visible=? ORDER BY weight ', [self.source.KEY, True])

Vilken SQL-databas gäller frågan? Regex är väl inte riktigt en standardfunktion i SQL-sammanhang, så det varierar nog om/hur det går att göra direkt i databasen.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem
Skrivet av evil penguin:

Vilken SQL-databas gäller frågan? Regex är väl inte riktigt en standardfunktion i SQL-sammanhang, så det varierar nog om/hur det går att göra direkt i databasen.

Det gäller Sqllite3, som du nämner så jag vet inte om det ens är möjligt.

Tanken var att jämföra direkt i databasen istället för att plocka ut värdena och jämföra i python.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem
Skrivet av M89:

Det gäller Sqllite3, som du nämner så jag vet inte om det ens är möjligt.

Tanken var att jämföra direkt i databasen istället för att plocka ut värdena och jämföra i python.

Mitt intryck är att det inte finns något regex-stöd inbyggt, varken matchning eller ersättning. (De har tydligen rent sql-syntaktiskt REGEXP som en jämförelseoperator men den är inte "inkopplad", se https://www.sqlite.org/lang_expr.html#like )

Det verkar ju finnas tillägg som t.ex. https://github.com/gwenn/sqlite-regex-replace-ext om man verkligen vill, men om man inte har en applikation som desperat behöver regex-stöd i databasen och som även behöver funka med sqlite så är det förmodligen bättre att tänka om.

Kanske kan du formulera om din ersättning utan regex? Annars är det väl som du säger att lägga den logiken i din egen applikation istället.

Visa signatur

Desktop: Ryzen 5800X3D || MSI X570S Edge Max Wifi || Sapphire Pulse RX 7900 XTX || Gskill Trident Z 3600 64GB || Kingston KC3000 2TB || Samsung 970 EVO Plus 2TB || Samsung 960 Pro 1TB || Fractal Torrent || Asus PG42UQ 4K OLED
Proxmox server: Ryzen 5900X || Asrock Rack X570D4I-2T || Kingston 64GB ECC || WD Red SN700 1TB || Blandning av WD Red / Seagate Ironwolf för lagring || Fractal Node 304

Permalänk
Medlem

Tack för ditt svar! Jag fick genast en annan idé hur jag ska ta mig runt problemet. Troligtvis blir det att permanent ändra custom.id.

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B