SQL Replace

Muss man in einer Datenbank einen String ersetzen, kann dies einfach mit einem REPLACE Statement erledigt werden.

REPLACE sucht nach einer bestimmten Zeichenfolge eines Strings und ersetzt diesen mit einer anderen Zeichenfolge. Somit ergibt dieses Statement:

SELECT Replace('Camma Rocks!', 'Rocks', 'Rolls')
gibt folgendes zurück

Camma Rolls!

REPLACE sucht im ersten String nach einer Übereinstimmung mit dem zweiten String und ersetzt diese mit dem dritten String. Die Stringlänge des alten und des neuen Strings müssen nicht übereinstimmen. Beispiel:

SELECT Replace('Camma Rocks!', 'Rocks', 'is cool')
ergibt:

Camma is cool!

Hier wurde ein 5 Zeichen String mit einem 7 Zeichen String ersetzt. Wenn der String nicht gefunden wird, werden keine Änderungen vorgenommen:

SELECT Replace('Camma Rocks!', 'Milch', 'Zucker')
gibt genau das zurück was vorher schon da war:

Camma Rocks!

Replace kann auch in Update-Statements genutzt werden.

Update adressen
Set ortschaft = replace(ortschaft, 'Moritz, 'St Moritz');

Alle Orte welche „Moritz“ im Namen haben werden durch „St Moritz“ ersetzt. Bei allen anderen Orten wird nichts unternommen.

Natürlich kann dem Statement auch eine genauere Auswahl der Datensätze zur Verfügung gestellt werden.

UPDATE adressen
set ortschaft = replace(ortschaft, 'Moritz, 'St Moritz')
WHERE ortschaft LIKE 'Moritz%';

Dies verändert nur die Datensätze welche mit „Moritz“ beginnen.

Veröffentlicht unter SQL | Verschlagwortet mit

SQL: doppelte Datensätze finden

Will man auf einer Tabelle in nachhinein  einen Key über mehrere Felder anlegen, scheitert das machmal an doppelten Datensätzen. Mit folgendem Schnippsel kann man doppelte Datensätze finden:

Hier ein Beispiel für eine Zelle

SELECT domain, COUNT(domain) AS NumOccurrences
FROM domains
GROUP BY domain
HAVING ( COUNT(domain) > 1 )

Hier ein Beispiel für einen Schlüssel über mehrere Zellen:

SELECT domain, subdomain, email, COUNT(domain) AS NumOccurrences
FROM domains
GROUP BY domain, subdomain, email
HAVING ( COUNT(domain) > 1 and COUNT(subdomain) > 1 and COUNT(email) > 1)

Veröffentlicht unter SQL | Verschlagwortet mit ,

CMS Made Simple: Zeichenanzahl Inhalt begrenzt

Speichert CMS Made Simple bei einer Seite mit sehr grossen Inhalt nicht mehr alles was eingegeben wurde, kann dies an der grössen Beschränkung des Datenfeldyps „Text“ liegen. Der Datenfeldtyp „Text“  ermöglicht -> 2^16 = 65536 Zeichen zu speichern. Je nach Inhalt einer CMS Seite ist dies zu wenig. Stellt man das content Feld auf „Textlong“ -> 2^32 = 4294967296  hat man wieder genügend Zeichen zur Verfügung.

Folgendes Feld muss angepasst werden:
Tabelle: cms_content_props
Feld: content

COALESCE – SQL mehrere Felder mit teilweisen Null-Werten zusammenfügen

In MS SQL Server fügt man verschiedene Felder in der Regel so zusammen:

select vorname + ' ' + nachname as name, strasse, plz + ' ' + ort as ortschaft from adresse

Wenn nun in einem der zusammengefügten Felder kein Wert steht, wird NULL als Rückgabewert zurückgegeben.

Hier hilft die Funktion COALESCE

coalesce(ausdruck_1, ausdruck_2[, _ audruck_n])

Die Funktion COALESCE kann eine beliebige Anzahl von Parametern verarbeiten. Die übergebenen Parameter sind typischerweise Ausdrücke, die der Reihe nach ausgewertet werden. Der erste Ausdruck, der einen Wert ungleich NULL zurückliefert, bestimmt das Ergebnis der Funktion. Geben alle Ausdrücke NULL zurück, so ist das Ergebnis der Funktion NULL. Es müssen mindestens 2 Parameter übergeben werden. Ausserdem sollten die darauf achten, dass alle Ausdrücke einen Wert vom selben Datentyp zurückliefern oder zumindest eine implizite Typenumwandlung unterstützen.

Die Funktion COALESCE ist äquivalent mit folgenden CASE-Funktionen


Case
When ausdruck_1 ist not null then ausdruck_1
When ausdruck_2 ist not null then ausdruck_2
-
When ausdruck_n ist not null then ausdruck_n
Else null
end

Somit kann die obere SQL Abfrage so aufgebaut werden:

select coalesce(vorname,'') + ' ' + coalesce(nachname,'') as name, strasse, coalesce(plz,'') + ' ' + coalesce(ort,'') as ortschaft from adresse

Veröffentlicht unter SQL | Verschlagwortet mit

Automatisiertes MySQL Backup

Im Moment beschäftige ich mich mit dem automatisierten Backup von MySQL sowie Webseiteninhalten.

Eine Möglichkeit zum Backupen von MySQL DBs ist der MySQL Administrator. Er kann auch automatisiert Backups erstellen. Nachteil dieser Lösung ist, dass ein PC/Mac laufen muss, damit das Backup automatisiert über den Cronjob ausgeführt wird.

Ein MySQL Backup kann jedoch auch über ein Shell Script oder ein PHP Script erstellt werden. Dieses wird dann vom Server mit Cronjob regelmässig aufgerufen:


%s/backup.sql.gz',
$dbhost,
$dbuser,
$dbpwd,
$dbname,
getenv('DOCUMENT_ROOT')
)
);
?>

Wer es ein wenig detaillierter haben will, findet im selfphp Kochbuch Hilfe.

Ein weiteres sehr gutes Script findet sich bei DragonDesign. Ich werde dieses Backupscript als Grundlage für meine Weiterentwicklung gebrauchen.

Folgende Punkte will ich zusätzlich integrieren:

  • Backup vordefinierter Ordner
  • Komprimieren des File und MySQL Backups in einem Archiv
  • Automatisiertes Hochladen des Backups auf einen entfernten FTP Server

Je nach dem wie gut mein Hack ist, werde ich das Script danach hier zum Download anbieten.

Datenbankfelder mit verschiedenen Formatierungen kombinieren

Will man in einem SQL Statement ein int und ein varchar Feld zusammen in einem virtuellen Feld ausgeben, muss man die Werte auf einen gleichen Nenner (Typ) bringen:


cast(Int_Feld as varchar)

Das Statement lautet also:


select cast(int_Feld as varchar) + ' ' + varcharFeld as kombiniertes_Feld from tabelle

Veröffentlicht unter SQL | Verschlagwortet mit

MS SQL Server Befehle

MS SQL und MySQL sind ja in vielem ähnlich. Leider sind jedoch die einen oder anderen Befehle dennoch anders geschrieben. So geht z.B. „limit“ nicht unter MS SQL.

2 Seiten welche die SQL Befehle für MS SQL auflisten, sind hier zu finden:

SQL Tutorial

Einfache Beispiele für SQL Kommandos

Umfangreiches Tutorial zu MS SQL Server Befehlen (Es gibt auch ein MySQL Tutorial auf dieser Seite)

Veröffentlicht unter SQL | Verschlagwortet mit