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 που έχεις παραπάνω και μετά θα έκανες κάτι της μορφής:

Code: Select all

Where X>@a AND Y>@b
Φαντάζομαι τα 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.
Ελπίζω να μην είπα βλακεία... :)
:smt018 Οχι!

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 μήπως βρείς κάτι σχετικό με αυτά... :smt023