Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

SQL απορια για query

Îåêßíçóå áðü ôï ìÝëïò spyros. Τελευταία δημοσίευση από το μέλος cap στις 22-07-2005, 03:57. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  14-07-2005, 15:12 3465

    SQL απορια για query

     εχουμε ενα πινακα (books) με τη μία στήλη(title) να περιέχει ονοματα βιβλίων . μπορόύμε με query να επιλέγουμε τις εγγραφές που περιέχουν στο title μια συγκεκριμένη λέξη ,εστω 'word' πχ 'word 2000'? 

    το select * from books where title like 'word' επιστρέφει ακόμα και τιτλους που εχουν το word σαν τμήμα άλλης λέξης  ενω

    το select * from books where title = 'word' επιστρέφει μόνο τιτλους που λέγονται word

  •  14-07-2005, 15:25 3467 σε απάντηση της 3465

    Re: SQL απορια για query

    Δυστυχώς το like δεν είναι τόσο έξυπνο, καταλαβαίνει μόνο δύο wildcards, το _ και το %. Για να βρεις ολόκληρες λέξεις θα πρέπει να δώσεις όλες τις δυνατές μορφές της λέξης, πχ:

    select * from books where title like '% word %' or title like '% word.%' or title like '% word,%' or title like '%.word %' or title like '%,word %'

    Αν έχει κανείς καμμία καλύτερη ιδέα ...
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  14-07-2005, 15:47 3468 σε απάντηση της 3467

    Re: SQL απορια για query

    Αν είσαι σίγουρος για το τι προηγείται ή έπεται της λέξης που αναζητάς, μπορείς να χρησιμοποιήσεις expressions μέσα στο like. Για παράδειγμα:

    SELECT *
    FROM BOOKS
    WHERE
    TITLE LIKE
    '%[^abcdefghijilmnopqrstuvwxyz0123456789]word[^abcdefghijilmnopqrstuvwxyz0123456789]%'

    Το expression περικλείεται από τα brackets [] και οτιδήποτε βρίσκεται εκεί μέσα ακολουθεί τους εξής κανόνες:

    Αν προηγείται στην αρχή ο χαρακτήρας ^, τότε δεν θα πρέπει να βρεθεί ένα από τα επόμενα γράμματα. π.χ. %[^012]word% θα σου φέρει τα aword, bword, zword, bwords, cwordprocessor αλλά όχι τα 0word, whatever1wordprocessor.

    Αν δεν προηγείται, τότε θα πρέπει οπωσδήποτε να βρεθεί ένα από τα επόμενα γράμματα. Π.χ. %[012]word% θα σου φέρει τα 1word, my2words, αλλά όχι τα whateverbword, cword κλπ.

    Το %[^abc]word% π.χ. σου βρίσκει όλα τα occurences της λέξης word όταν αυτή ΔΕΝ προηγείται (εξ'ού ο χαρακτήρας ^ που δηλώνει το "δεν"), από τα γράμματα a b c. Δηλαδή δεν θα σου φέρει εγγραφές που περιέχουν τις λέξεις aword, bword, cword, myaword, whateverbword κλπ.

    Φυσικά αν θέλεις να περιλαμβάνεις και εγγραφές που η λέξη βρίσκεται στην αρχή ή το τέλος του πεδίου πρέπει να κάνεις το εξής:

    SELECT *
    FROM BOOKS
    WHERE
    TITLE LIKE
    '%[^abcdefghijilmnopqrstuvwxyz0123456789]word[^abcdefghijilmnopqrstuvwxyz0123456789]%'
    OR
    TITLE LIKE
    'word[^abcdefghijilmnopqrstuvwxyz0123456789]%'
    OR
    TITLE LIKE
    '%[^abcdefghijilmnopqrstuvwxyz0123456789]word'


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  17-07-2005, 14:45 3545 σε απάντηση της 3465

    Re: SQL απορια για query

    Ποτέ μην χρησιμοποιείς την σύνταξη "select *...". Αυξάνεις τον όγκο των δεδομένων που επιστρέφονατι από την βάση και -από πείρας στο λέω- το πιο πιθανό είναι να μην χρειάζεσαι όλη αυτή τη πληροφορία στις περισσότερες περιπτώσεις.

    Προσπάθησε να αποφεύγεις τα or σε where clause των queries που γράφεις(όποτε αυτό είναι δυνατόν). Αν π.χ. ψάχνεις μόνο για "word" τότε μπορείς να εκταλέσεις την sql:
    select column-1, column-2,...column-n from books where title like '%word%'
    Σημείωση: Αν ακολουθήσεις αυτή τη σύνταξη (%word%), τότε ο SQL Server ακόμα και αν η στήλη title έχει κάποιο index, ΔΕΝ θα το χρησιμοποιήσει.

    Αν π.χ. ψάχνεις για "word" ή "word 2000" τότε μπορείς να εκταλέσεις την sql:
    select column-1, column-2,...column-n from books where title like '%word%'
    union
    select column-1, column-2,...column-n from books where title like '%word 2000%'

    Σε πίνακες με πολλά rows θα εκτελεστεί πιο γρήγορα από το ...title like '%word%' or title like '%word 2000%'


  •  22-07-2005, 00:37 3741 σε απάντηση της 3545

    Απ:Re: SQL απορια για query

    Γεια σας,

    η εντολή

    SELECT *
    FROM BOOKS
    WHERE
    TITLE LIKE '_word 2000_'

    δε σε βοηθάει???
    αν έδινες ένα παράδειγμα του αποτελέσματος του query θα βοήθαγες...
    Κάποια στιγμή είχα χρησιμοποιήσει σε sql plus query που περιείχε το χαρακτήρα Ω ,
    δε θυμάμαι όμως για ποιό ακριβώς λόγο το έκανα και αν είχα βάλει like πριν...
  •  22-07-2005, 03:57 3744 σε απάντηση της 3545

    Απ:Re: SQL απορια για query

     yiannispan wrote:
    Ποτέ μην χρησιμοποιείς την σύνταξη "select *...". Αυξάνεις τον όγκο των δεδομένων που επιστρέφονατι από την βάση και -από πείρας στο λέω- το πιο πιθανό είναι να μην χρειάζεσαι όλη αυτή τη πληροφορία στις περισσότερες περιπτώσεις.

     

    Σωστό! Συν οτι ο SQL Server αναλώνει χρόνο στο να κάνει το resolve των πεδίων που πρέπει να επιστρέψει (σωστα τα λέω Πανο; ). Απλά κι εγώ δεν έδωσα σημασία στο αστεράκι, λόγω του οτι το θέμα μας αφορούσε περισσότερο το WHERE clause. Παντως είναι μια πολύ σωστή παρατήρηση.

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems