Schrift
[thread]12135[/thread]

SQL::Abstract::Problem

Leser: 2


<< >> 2 Einträge, 1 Seite
Froschpopo
 2008-07-05 09:41
#111872 #111872
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Hallo Perlcommunity!

Ich möchte folgendes Statement erzeugen:
Code: (dl )
SELECT * FROM users WHERE datum > FUNKTION AND datum = ANDERE_FUNKTION()


hierzu möchte ich gerne SQL::Abstract verwenden:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl

use strict;
use warnings;
use SQL::Abstract;

my $sql = new SQL::Abstract;

my ($stmt, @bind) = $sql->select('users', '*', {
                -and => [
                        datum => {'>'   => 'FUNKTION()' },
                        datum => {'='   => 'ANDERE_FUNKTION()' }
                ]
        }
);

print $stmt, "\n";
print @bind,"\n";


Ergebnis:
Das Problem allerdings ist, dass die Funktionen gequotet und deshalb von mySQL nicht als Funktion annerkannt werden:
SELECT * FROM users WHERE datum > ? AND datum = ?

mySQL bekommt also fälschlicherweise:
SELECT * FROM users WHERE datum > 'FUNKTION' AND datum = 'ANDERE_FUNKTION()'
Froschpopo
 2008-07-05 16:29
#111874 #111874
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
Ich habe jetzt erstmal eine Notlösung gefunden:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use strict;
use warnings;
use SQL::Abstract;

my $sql = SQL::Abstract->new;

my %where = ();

my @sql_interval = (
        'birthday', \'> DATE_SUB(CURDATE(), INTERVAL 20 YEAR)'
);

push @sql_interval, ('birthday', \'< BLABLA()');

$where{-and} = \@sql_interval;

my ($stmt, @bind) = $sql->select('defaultusers', 'birthday', \%where);

print $stmt, "\n";


Mit der Lösung schleuse ich die Funktion an den Platzhaltern vorbei. Dann muss ich die 20 (Beispielwert) halt mit DBI::quote() escapen.
<< >> 2 Einträge, 1 Seite



View all threads created 2008-07-05 09:41.