PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   MySQLi/PDO/(MySQL) (http://www.selfphp.de/forum/forumdisplay.php?f=22)
-   -   Spalte prüfen. (http://www.selfphp.de/forum/showthread.php?t=23775)

-sensemann- 21.11.2010 17:29:39

Spalte prüfen.
 
Hallo zusammen,

ich hab eine Spalte einer Tabelle in der stehen z.b. folgende Werte:

123456;000000;456789;

also immer 6 Zahlen und ein Semikolon.

Gibt es eine Abfrage mir der ich überprüfen kann ob ich Fehler habe ? Also prüfen ob die Zahlen auch immer 6 stellig sind ?

Gruß
Sensemann

DokuLeseHemmung 21.11.2010 17:33:56

AW: Spalte prüfen.
 
Zitat:

also immer 6 Zahlen und ein Semikolon.
Vermutlich ein böser Verstoß gegen die erste Normal Form.
Die 5 Normal Formen

-sensemann- 21.11.2010 18:10:12

AW: Spalte prüfen.
 
Zitat:

Zitat von DokuLeseHemmung (Beitrag 139180)
Vermutlich ein böser Verstoß gegen die erste Normal Form.
Die 5 Normal Formen

Hat dann wohl schon seine Gründe warum ich das so habe. Hat mir nicht wirklich weitergeholfen deine Antwort !

thomas_w 21.11.2010 19:30:24

AW: Spalte prüfen.
 
Ich hab's mal mit einer STORED FUNCTION probiert. Hier ein kleiner Test dazu:

Code:

CREATE TABLE test_string (
 id INT NOT NULL,
 csv_daten VARCHAR(100)
);

INSERT INTO test_string VALUES
( 1, '1234;12345;12456;1234567;12345678'),
( 2, '1234;12345;12456;1234567;12345678;'),
( 3, '1234;12345;12456;1234567;1;2345678;');

DELIMITER $$
CREATE FUNCTION count_substring(p_sVar VARCHAR(100), p_sSep VARCHAR(10) )
 RETURNS INT
 LANGUAGE SQL
BEGIN
 DECLARE v_i INT;
 DECLARE v_length INT;
 DECLARE v_count INT;
 
 SET v_length := LENGTH(p_sVar);
 SET v_i := 1;
 SET v_count := 0;
 
 WHILE (v_i <= v_length) DO
  IF SUBSTRING(p_sVar,v_i,1) = p_sSep THEN
  SET v_count := v_count +1;
  END IF;
  SET v_i := v_i +1;
 END WHILE;
 RETURN v_count;
END$$

DELIMITER ;

SELECT id, count_substring(csv_daten,';') AS anzahl_sep from test_string
where count_substring(csv_daten,';') > 3
order by id;
+----+------------+
| id | anzahl_sep |
+----+------------+
|  1 |          4 |
|  2 |          5 |
|  3 |          6 |
+----+------------+
3 rows in set (0.00 sec)

mysql>

Grüße
Thomas

-sensemann- 21.11.2010 19:52:59

AW: Spalte prüfen.
 
Da kann ich schon was mit anfangen. Vielen Dank !

-sensemann- 22.11.2010 20:26:02

AW: Spalte prüfen.
 
PHP-Code:

DELIMITER //
CREATE FUNCTION count_substring(p_sVar VARCHAR(100), p_sSep VARCHAR(10) )
RETURNS INT
LANGUAGE SQL
BEGIN
DECLARE v_i INT;
DECLARE 
v_length INT;
DECLARE 
v_count INT;

SET v_length := LENGTH(p_sVar);
SET v_i := 1;
SET v_count := 0;

WHILE (
v_i <= v_length) DO
IF 
SUBSTRING(p_sVar,v_i,1) = p_sSep THEN
SET v_count 
:= v_count +1;
END IF;
SET v_i := v_i +1;
END WHILE;
RETURN 
v_count;
END$$

DELIMITER ;

SELECT `products_model`, count_substring(products_userfield_2,';') AS anzahl_sep from products
where count_substring
(products_userfield_2,';') > 3
order by 
`products_model

bringt folgendes :

SQL-Befehl: Dokumentation

SELECT `products_model` , count_substring(
products_userfield_2, ';'
) AS anzahl_sep
FROM products
WHERE count_substring(
products_userfield_2, ';'
) >3
ORDER BY `products_model`
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(products_userfield_2,';') AS anzahl_sep from products
where count_substring(pro' at line 1

???

thomas_w 22.11.2010 21:06:43

AW: Spalte prüfen.
 
Damit wir Dir helfen können, brauch es schon mehr als ein paar ???, sondern mindestens..

1. Die Strukturen der beteiligten Tabellen

Code:

mysql>SHOW CREATE TABLE products;

2. Ein paar sinnvolle Testdaten um den Fehler zu reproduzieren

Code:

INSERT INTO orders ....

Grüße
Thomas

-sensemann- 22.11.2010 21:18:02

AW: Spalte prüfen.
 
Ist ja im Grunde nichts anderes wie Du mir oben das Beispiel gegeben hast !

PHP-Code:

DELIMITER $$
CREATE FUNCTION count_substring(p_sVar VARCHAR(100), p_sSep VARCHAR(10) )
 
RETURNS INT
 LANGUAGE SQL 
BEGIN
 
DECLARE v_i INT;
 DECLARE 
v_length INT;
 DECLARE 
v_count INT;
 
 
SET v_length := LENGTH(p_sVar);
 
SET v_i := 1;
 
SET v_count := 0;
 
 WHILE (
v_i <= v_length) DO
  IF 
SUBSTRING(p_sVar,v_i,1) = p_sSep THEN
   SET v_count 
:= v_count +1;
  
END IF;
  
SET v_i := v_i +1;
 
END WHILE;
 RETURN 
v_count;
END$$

DELIMITER ;

SELECT idcount_substring(csv_daten,';') AS anzahl_sep from test_string
where count_substring
(csv_daten,';') > 3
order by id


Tabelle und Inserts wurden so angelegt wie Du beschrieben hast.
Die $$ bei DELIMITER musste ich durch // ersetzen damit MYSQL überhaupt was macht.

Hier mal die Fehlermeldung von deinem Script mit deiner Tabelle und deinem Insert :

HTML-Code:

DELIMITER $$ CREATE FUNCTION count_substring(
p_sVar VARCHAR( 100 ) ,
p_sSep VARCHAR( 10 )
) RETURNS INTLANGUAGE SQL BEGIN DECLARE v_i INT;

DECLARE v_length INT;

DECLARE v_count INT;

SET v_length := LENGTH( p_sVar ) ;

SET v_i :=1;

SET v_count :=0;

WHILE(
v_i <= v_length
) DO IF SUBSTRING( p_sVar, v_i, 1 ) = p_sSep THEN SET v_count := v_count +1;

END IF ;

SET v_i := v_i +1;

END WHILE;

RETURN v_count;

END$$

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(p_sVar VARCHAR(100), p_sSep VARCHAR(10) )
RETURNS INT
LANGUAGE SQL
BEGIN
' at line 1

Wenn ich die $$ ersetze durch // (weil ich das irgendwo gelesen habe, ob richtig ist weiß ich nicht) nur noch dies :
HTML-Code:

Fehler

SQL-Befehl: Dokumentation

SELECT id, count_substring(
csv_daten, ';'
) AS anzahl_sep
FROM test_string
WHERE count_substring(
csv_daten, ';'
) >3
ORDER BY id
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(csv_daten,';') AS anzahl_sep from test_string
where count_substring(csv_daten,'' at line 1

Zumindest wird mit // die Funktion genommen.
Ich hab leider keinen Plan und probiere nur so rum !

Gruß
Sensemann

thomas_w 22.11.2010 21:35:06

AW: Spalte prüfen.
 
Zitat:

Zitat von -sensemann- (Beitrag 139204)

DELIMITER $$ CREATE FUNCTION count_substring(p_sVar VARCHAR(100), p_sSep VARCHAR(10) )
RETURNS INT

...

Der DELIMITER $$ ist ein eigener Befehl, der mit einem Zeilenumbruch abgeschlossen sein muss. In der neuen Zeile beginnt dann das CREATE ...

Also genau so, wie ich es in meinem Beispiel (#4) beschrieben habe. Wenn Du den gesamten Code 1 zu 1 in die Zwischenablage kopierst und in der MySQL-Kommandozeile einfügt, wird alles korrekt ausgeführt.

Ob als DEMILITER und als Ende der CREATE Function das $$ oder // verwendet wird, ist egal. Beides funktioniert. Allerdings nicht gemischt.

Wie Du in #4 sieht, habe ich alles in der MySQL-Konsole korrekt ausgeführt (MySQL 5.1.44). MySQL-Versionen vor 5.0 können kein CREATE FUNCTION ...

Einfach noch mal konzentriert das Beispiel #4 durchgehen. Dann klappt es schon.

Grüße
Thomas

-sensemann- 22.11.2010 21:43:23

AW: Spalte prüfen.
 
Dann hab ich wohl eine Version wo es nict funktioniert !

MySQL-Client-Version: 5.0.83

Geht nämlich nicht 1 : 1 Nur Fehler.

Danke erst mal !

Gruß
Sensemann


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:04:56 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.