Page 1 of 1
SQL where clause
Posted: Wed Aug 15, 2007 11:06 am
by Swtos
Θέλω να κάνω το εξής στον SQL Server 2005:
Να κάνω DECLARE μια μεταβλητη varchar(...) και μετά να την κανω SET με μία τιμή όπως 'Χ>4 AND Υ>8'. Έπειτα να εκτελέσω ένα query της μορφής,
SELECT ...
FROM ...
WHERE @μεταβλητή
Αυτό όμως μου πετά error "An expression of non-boolean type specified in a context where a condition is expected" το οποίο ειναι μεν λογικό καθώς η μεταβλητη είναι varchar.
Ξερει κανεις αν και πως μπορώ να κανω κατι τετοιο, δηλαδη στο where απλα να εισαγω το όνομα μιας μεταβλητης?
Ευχαριστώ!
Posted: Wed Aug 15, 2007 11:25 am
by Luke
Στο Where clause πρέπει να γράψεις
Where <όνομα_στήλης_της _μεταβλητής> = <τιμή_που_θες>.
Αν θες να εμφανίζει όλες τιμές της μεταβλητής απλά δε βάζεις where clause.
Ελπίζω να κατάλαβα σωστά την απορία σου...
Posted: Wed Aug 15, 2007 11:56 am
by Swtos
To θέμα είναι πως το κομματι <όνομα_στήλης_της _μεταβλητής> = <τιμή_που_θες> είναι αποθηκευμένο σε μία μεταβλητη. Θέλω να βάλω αυτή τη μεταβλητή στο where και οχι καθε ονομα και τιμη μεταβλητής...ευχαριστώ παντως...

Posted: Wed Aug 15, 2007 1:09 pm
by Luke
Α, τώρα κατάλαβα.
Θα πρότεινα κάτι άλλο. Να είχες 2 μεταβλητές (π.χ. a, b) στις οποίες θα αποθήκευες τις τιμές 4 και 2 που έχεις παραπάνω και μετά θα έκανες κάτι της μορφής:
Φαντάζομαι τα X και Y είναι ονόματα στηλών, έτσι; Δε σε βολεύει κάτι τέτοιο;
Posted: Wed Aug 15, 2007 3:08 pm
by Swtos
Αυτό το εχω σκεφτεί απλα στην περιπτωσή μου είναι μαλλον πολυ πολυπλοκο να το κανω. Βασικά εχω έναν πινακα Α ο οποιός έχει μία στήλη varchar(...). Ουσιαστικά σκανάρω αυτή την στήλη με έναν cursor και παιρνω καθε φορά κατι της μορφής 'X>5 AND r>7'. Δηλαδή σε κάθε πέρασμα δεν ξερώ ούτε πόσα ουτε ποια Χ,Υ, κτλ θα συναντήσω. Αυτο το 'X>5 AND r>7' θέλω να το χρησιμοποιήσω αυτούσιο στο WHERE clause ενός query σε εναν άλλο πίνακα Β ο οποίος έχει για στήλες όλα τα πιθανα Χ, Υ, κτλ. Βασικά μαλλον δε πρεπει να γίνεται απο όσο το εψαξα...ευχαριστω και παλι...
Posted: Fri Aug 17, 2007 11:11 am
by tsilochr
σε MS SQL Server 2000 χρησιμοποιούσα την sp_executesql για να τρέχω queries που χτίζοταν δυναμικά
για κοίτα ->
http://msdn2.microsoft.com/en-us/library/ms188001.aspx
Re: SQL where clause
Posted: Thu Mar 04, 2010 10:06 pm
by Spy
Εχω αυτους του 3 πινακες
Code: Select all
CREATE TABLE `Client` (
`cid` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`csurname` VARCHAR( 40 ) NULL
) ENGINE=INNODB;
CREATE TABLE `Order` (
`orderID` INT NOT NULL AUTO_INCREMENT ,
`cID` INT NOT NULL ,
`oaddress` VARCHAR( 40 ) NULL ,
INDEX cus_id (`cID`),
PRIMARY KEY ( `orderID` ),
FOREIGN KEY (`cID`) REFERENCES `Client` (`cID`)
ON DELETE CASCADE
) ENGINE=INNODB ;
CREATE TABLE `csecurity` (
`securityID` INT NOT NULL AUTO_INCREMENT ,
`oID` INT NOT NULL ,
`secCode` VARCHAR( 40 ) NOT NULL ,
INDEX orsec_id (`oID`),
PRIMARY KEY ( `securityID`),
FOREIGN KEY (`oID`) REFERENCES `Order` (`orderID`)
ON DELETE CASCADE
) ENGINE=INNODB;
σε βάση My-SQL
Θέλω να βρω τους Client έχουν εγγραφές στο csecurity
και αυτούς που δεν εχουν.....
Πώς μπορώ να κάνω το Query.... Ξέρει κανένας;
Re: SQL where clause
Posted: Fri Mar 05, 2010 11:44 am
by The Punisher
Code: Select all
SELECT DISTINCT client.csurname FROM Client, Order, csecurity
WHERE csecurity.oID == Order.orderID AND Order.cID == Client.cID
κάτι τέτοιο;
Re: SQL where clause
Posted: Fri Mar 05, 2010 5:28 pm
by Spy
The Punisher wrote:Code: Select all
SELECT DISTINCT client.csurname FROM Client, Order, csecurity
WHERE csecurity.oID == Order.orderID AND Order.cID == Client.cID
κάτι τέτοιο;
Ναι αυτό είναι...(ευχαριστώ) αλλά για το ερώτημα "όσους δεν έχουν εγγραφές, το EXCEPT δεν λειτουργει σε MY-SQL...
Code: Select all
SELECT DISTINCT client.csurname FROM `Client`
EXCEPT
SELECT DISTINCT client.csurname FROM `Client`, `Order`, `csecurity`
WHERE (csecurity.oID = Order.orderID AND Order.cID = Client.cID)
Σε My-SQL πως μπορώ να αφαιρέσω κάποια αποτελέσματα;
Re: SQL where clause
Posted: Fri Mar 05, 2010 6:22 pm
by Luke
Αν και έχω πολύ καιρό να ασχοληθώ με SQL δε δουλεύει με το παραπάνω απλά αντικαθιστώντας τα == με <>; Ή μπορεί να χρειάζεται μόνο το κομμάτι πριν το AND αυτή την αλλαγή για να αποκλείσεις τις εγγραφές που σχετίζονται μόνο με το csecurity.
Ελπίζω να μην είπα βλακεία...

Re: SQL where clause
Posted: Fri Mar 05, 2010 6:35 pm
by Spy
Luke wrote:Αν και έχω πολύ καιρό να ασχοληθώ με SQL δε δουλεύει με το παραπάνω απλά αντικαθιστώντας τα == με <>; Ή μπορεί να χρειάζεται μόνο το κομμάτι πριν το AND αυτή την αλλαγή για να αποκλείσεις τις εγγραφές που σχετίζονται μόνο με το csecurity.
Ελπίζω να μην είπα βλακεία...


Οχι!
Re: SQL where clause
Posted: Sat Mar 06, 2010 5:38 pm
by Zifnab
Στην mySQL δεν υπάρχει except και minus...
Οπότε οι τρείς λυσεις που προτείνονται στα fora είναι:
με self-join exclusion
με not-in
ή με left join (?)
Για googlise μήπως βρείς κάτι σχετικό με αυτά...
