Text ohne beginnendem Backslash

dcst55

Aktiver Benutzer
Beiträge
48
Hallo zusammen,

ich möchte aus einem Textfeld alle Links raussuchen, die ohne führenden Backslash beginnen.

Ich bekomme es beim besten Willen nicht auf die Kette..
 
Werbung:
in PG:

Code:
postgres=# create table dcst55(id int generated always as identity primary key, link text);
CREATE TABLE
postgres=# copy dcst55 (link) from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself, or an EOF signal.
>> text1
>> \\link1
>> text2
>> \\link2
>> \.
COPY 4
postgres=# select * from dcst55;
 id |  link  
----+--------
  1 | text1
  2 | \link1
  3 | text2
  4 | \link2
(4 rows)

postgres=# select * from dcst55 where link ~ '^\\.*';
 id |  link  
----+--------
  2 | \link1
  4 | \link2
(2 rows)

postgres=# select * from dcst55 where link !~ '^\\.*';
 id | link  
----+-------
  1 | text1
  3 | text2
(2 rows)

postgres=#

MySQL hat vermutlich auch Möglichkeiten, nach Zeichenketten zu suchen. Das Handbuch sollte helfen.
 
Ich muss nochmal fragen, ich werde wahnsinnig...

Meine Abfrage sieht wie folgt aus:

Ich möchte alle Links finden, die kein / vor dem Wort downloads gesetzt haben:

SELECT * FROM `knh1z_j2store_products` WHERE `params` LIKE '%href=\"\downloads';
 
erstellen der tabelle mit datensätzen
Code:
create table links(link text);
insert into links(link) values ('/download/x');
insert into links(link) values ('download/x');

erstellen der abfrage
Code:
select * from links
except
select * from links where link like '/%';

ergebnis
Code:
download/x

Nutze PostgreSQL...
 
Jetzt habe ich es... 🥳

So erhalte ich exakt alle Datensätze, die kein slash vorgesetzt haben! Danke an Thallius für den Denkanstoß
SELECT * FROM `knh1z_j2store_products` WHERE `params` NOT LIKE '%/downloads%'
 
Wenn das in Poster so kompliziert ist, dann bleib ich lieber by mySQL

Siehe #2.

Bonus:

wir erzeugen einen conditional Index auf der Spalte, der die Abfrage beschleunigen wird:

Code:
postgres=# create index idx_link on dcst55 (link) where link !~ '^\\.*';
CREATE INDEX
postgres=# explain analyse select * from dcst55 where link !~ '^\\.*';
                                                    QUERY PLAN                                                     
-------------------------------------------------------------------------------------------------------------------
 Index Scan using idx_link on dcst55  (cost=0.13..12.18 rows=4 width=36) (actual time=0.147..0.150 rows=2 loops=1)
 Planning Time: 0.371 ms
 Execution Time: 0.166 ms
(3 rows)

postgres=#

Das mag hier aufgrund der wenigen Zeilen (habe nur 4 in der Tabelle) unsinnig sein, was auch der Planner erkennt (daher set enable_seqscan to off;), aber bei größeren Datenmengen kann das durchaus hilfreich sein. Dein MySQL kann sowas z.B. nicht.
 
Werbung:
Zurück
Oben