SQL where clause

Συζητήσεις για γλώσσες προγραμματισμού και θέματα σχετικά με προγραμματισμό.
Post Reply
User avatar
Swtos
Kilobyte level
Kilobyte level
Posts: 309
Joined: Mon Apr 18, 2005 4:52 pm
Academic status: MSc
Gender:
Location: Δ.Π

SQL where clause

Post by Swtos » Wed Aug 15, 2007 11:06 am

Θέλω να κάνω το εξής στον 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 απλα να εισαγω το όνομα μιας μεταβλητης?

Ευχαριστώ!
-My father made him an offer he couldnt refuse
-What was that?
-Luca Brasi held a gun to his head and my father assured him that either his brain or his signature would be on the contract

-The Godfather
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Post by Luke » Wed Aug 15, 2007 11:25 am

Στο Where clause πρέπει να γράψεις
Where <όνομα_στήλης_της _μεταβλητής> = <τιμή_που_θες>.
Αν θες να εμφανίζει όλες τιμές της μεταβλητής απλά δε βάζεις where clause.
Ελπίζω να κατάλαβα σωστά την απορία σου...
Είμαι ένας μοναχικός cowboy...
User avatar
Swtos
Kilobyte level
Kilobyte level
Posts: 309
Joined: Mon Apr 18, 2005 4:52 pm
Academic status: MSc
Gender:
Location: Δ.Π

Post by Swtos » Wed Aug 15, 2007 11:56 am

To θέμα είναι πως το κομματι <όνομα_στήλης_της _μεταβλητής> = <τιμή_που_θες> είναι αποθηκευμένο σε μία μεταβλητη. Θέλω να βάλω αυτή τη μεταβλητή στο where και οχι καθε ονομα και τιμη μεταβλητής...ευχαριστώ παντως... :-)
-My father made him an offer he couldnt refuse
-What was that?
-Luca Brasi held a gun to his head and my father assured him that either his brain or his signature would be on the contract

-The Godfather
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Post by Luke » Wed Aug 15, 2007 1:09 pm

Α, τώρα κατάλαβα.
Θα πρότεινα κάτι άλλο. Να είχες 2 μεταβλητές (π.χ. a, b) στις οποίες θα αποθήκευες τις τιμές 4 και 2 που έχεις παραπάνω και μετά θα έκανες κάτι της μορφής:

Code: Select all

Where X>@a AND Y>@b
Φαντάζομαι τα X και Y είναι ονόματα στηλών, έτσι; Δε σε βολεύει κάτι τέτοιο;
Είμαι ένας μοναχικός cowboy...
User avatar
Swtos
Kilobyte level
Kilobyte level
Posts: 309
Joined: Mon Apr 18, 2005 4:52 pm
Academic status: MSc
Gender:
Location: Δ.Π

Post by Swtos » Wed Aug 15, 2007 3:08 pm

Αυτό το εχω σκεφτεί απλα στην περιπτωσή μου είναι μαλλον πολυ πολυπλοκο να το κανω. Βασικά εχω έναν πινακα Α ο οποιός έχει μία στήλη varchar(...). Ουσιαστικά σκανάρω αυτή την στήλη με έναν cursor και παιρνω καθε φορά κατι της μορφής 'X>5 AND r>7'. Δηλαδή σε κάθε πέρασμα δεν ξερώ ούτε πόσα ουτε ποια Χ,Υ, κτλ θα συναντήσω. Αυτο το 'X>5 AND r>7' θέλω να το χρησιμοποιήσω αυτούσιο στο WHERE clause ενός query σε εναν άλλο πίνακα Β ο οποίος έχει για στήλες όλα τα πιθανα Χ, Υ, κτλ. Βασικά μαλλον δε πρεπει να γίνεται απο όσο το εψαξα...ευχαριστω και παλι...
-My father made him an offer he couldnt refuse
-What was that?
-Luca Brasi held a gun to his head and my father assured him that either his brain or his signature would be on the contract

-The Godfather
User avatar
tsilochr
Wow! Terabyte level
Wow! Terabyte level
Posts: 3246
Joined: Tue Mar 16, 2004 2:47 pm
Academic status: PhD
Gender:
Location: mm.aueb.gr
Contact:

Post by tsilochr » Fri Aug 17, 2007 11:11 am

σε MS SQL Server 2000 χρησιμοποιούσα την sp_executesql για να τρέχω queries που χτίζοταν δυναμικά

για κοίτα -> http://msdn2.microsoft.com/en-us/library/ms188001.aspx
User avatar
Spy
Kilobyte level
Kilobyte level
Posts: 443
Joined: Mon Dec 12, 2005 9:40 pm
Academic status: Alumnus/a
Gender:
Location: Ε-75, Ε-65, Ε-90
Contact:

Re: SQL where clause

Post by Spy » Thu Mar 04, 2010 10:06 pm

Εχω αυτους του 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.... Ξέρει κανένας;
The Punisher
Venus Former Team Member
Posts: 7561
Joined: Thu Oct 27, 2005 1:43 pm
Academic status: Alumnus/a
Gender:
Location: Boston, MA

Re: SQL where clause

Post by The Punisher » Fri Mar 05, 2010 11:44 am

Code: Select all

SELECT DISTINCT client.csurname FROM Client, Order, csecurity
WHERE csecurity.oID == Order.orderID AND Order.cID == Client.cID
κάτι τέτοιο;
User avatar
Spy
Kilobyte level
Kilobyte level
Posts: 443
Joined: Mon Dec 12, 2005 9:40 pm
Academic status: Alumnus/a
Gender:
Location: Ε-75, Ε-65, Ε-90
Contact:

Re: SQL where clause

Post by Spy » Fri Mar 05, 2010 5:28 pm

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 πως μπορώ να αφαιρέσω κάποια αποτελέσματα;
User avatar
Luke
Gbyte level
Gbyte level
Posts: 1388
Joined: Wed Aug 09, 2006 11:19 am
Academic status: Alumnus/a
Gender:

Re: SQL where clause

Post by Luke » Fri Mar 05, 2010 6:22 pm

Αν και έχω πολύ καιρό να ασχοληθώ με SQL δε δουλεύει με το παραπάνω απλά αντικαθιστώντας τα == με <>; Ή μπορεί να χρειάζεται μόνο το κομμάτι πριν το AND αυτή την αλλαγή για να αποκλείσεις τις εγγραφές που σχετίζονται μόνο με το csecurity.
Ελπίζω να μην είπα βλακεία... :)
Είμαι ένας μοναχικός cowboy...
User avatar
Spy
Kilobyte level
Kilobyte level
Posts: 443
Joined: Mon Dec 12, 2005 9:40 pm
Academic status: Alumnus/a
Gender:
Location: Ε-75, Ε-65, Ε-90
Contact:

Re: SQL where clause

Post by Spy » Fri Mar 05, 2010 6:35 pm

Luke wrote:Αν και έχω πολύ καιρό να ασχοληθώ με SQL δε δουλεύει με το παραπάνω απλά αντικαθιστώντας τα == με <>; Ή μπορεί να χρειάζεται μόνο το κομμάτι πριν το AND αυτή την αλλαγή για να αποκλείσεις τις εγγραφές που σχετίζονται μόνο με το csecurity.
Ελπίζω να μην είπα βλακεία... :)
:smt018 Οχι!
User avatar
Zifnab
Venus Former Team Member
Posts: 7581
Joined: Tue Nov 15, 2005 2:42 am
Academic status: MSc
Gender:
Location: Connecticut
Contact:

Re: SQL where clause

Post by Zifnab » Sat Mar 06, 2010 5:38 pm

Στην mySQL δεν υπάρχει except και minus...

Οπότε οι τρείς λυσεις που προτείνονται στα fora είναι:

με self-join exclusion
με not-in
ή με left join (?)

Για googlise μήπως βρείς κάτι σχετικό με αυτά... :smt023
Post Reply

Return to “Προγραμματισμός”