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

 

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

Αναζήτηση

Îåêßíçóå áðü ôï ìÝëïò vangelisan. Τελευταία δημοσίευση από το μέλος KelMan στις 19-10-2006, 11:17. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  19-10-2006, 02:02 18790

    Αναζήτηση

    Εχω έναν πίνακα ας πούμε tbl, ο οποίος περιέχει 3 πεδία nvarchar ας πουμε : text_gr, text_en και text_fr

    Στο παραπάνω πίνακα κάνω αναζήτηση για να βρώ εαν ή λέξη word υπάρχει σ' αυτά τα πεδία, με to εξής ερώτημα :

    SELECT *
    FROM tbl
    WHERE text_gr LIKE '%word%' 
          OR text_en LIKE '%word%'
          OR text_fr LIKE '%word%' ;

    Υπάρχει τρόπος, σε περίπτωση που η λέξη βρεθεί μέσα σε κάποιο από αυτά τα πεδία, o server να μου επιστρέψει το όνομα του πεδίου στο οποίο βρέθηκε ?

    Βαγγέλης


    Βαγγέλης Αναγνωστόπουλος
  •  19-10-2006, 02:24 18791 σε απάντηση της 18790

    Απ: Αναζήτηση

    To παρακάτω προσθέτει στο output ένα extra πεδίο (FoundField) που έχει τιμή το πεδίο που περιέχει την τιμή αναζήτησης.



    SELECT  *,
            CASE WHEN text_gr LIKE '%word%' THEN 'text_gr'
                 WHEN text_en LIKE '%word%' THEN 'text_en'
                 WHEN text_fr LIKE '%word%' THEN 'text_fr'
    END AS FoundField
    FROM    tbl
    WHERE   text_gr LIKE '%word%'
            OR text_en LIKE '%word%'
            OR text_fr LIKE '%word%'

     


    Vir prudens non contra ventum mingit
  •  19-10-2006, 02:39 18792 σε απάντηση της 18790

    Απ: Αναζήτηση

    Πανέξυπνο KelMan

    Ευχαριστώ
    Βαγγέλης Αναγνωστόπουλος
  •  19-10-2006, 08:17 18794 σε απάντηση της 18792

    Απ: Αναζήτηση

    Μόνο προσοχή γιατί το CASE σταματάει στο πρώτο WHEN που θα γίνει true, οπότε αν το text υπάρχει σε πολλαπλά columns τότε θα πάρεις μόνο το πρώτο. Για κάτι που να έχει καλύτερη λογική, θα πρέπει να πας σε stored procedure.
    Vir prudens non contra ventum mingit
  •  19-10-2006, 10:01 18798 σε απάντηση της 18794

    Απ: Αναζήτηση

    Υπάρχει μια λύση και σε αυτό, η οποία δεν είναι και η αποδοτικότερη του κόσμου, αλλά δουλεύει παρόλα αυτά:
    SELECT * FROM
    (
    SELECT ID, 'Text_GR' FieldName, Text_GR FieldValue FROM tbl
        UNION
    SELECT ID, 'Text_EN' FieldName, Text_EN FieldValue FROM tbl
        UNION
    SELECT ID, 'Text_FR' FieldName, Text_FR FieldValue FROM tbl
    ) X
    WHERE X.FieldValue LIKE '%T%'


    Νατάσα Μανουσοπούλου
  •  19-10-2006, 11:17 18803 σε απάντηση της 18798

    Απ: Αναζήτηση

     Χε χε χε... Όταν διάβασα το query, λέω "χμμμ... και γιατί να μην βάλουμε το WHERE μέσα σε κάθε sub-select", δηλαδή:

    SELECT * FROM
    (
    SELECT ID, 'Text_GR' FieldName, Text_GR FieldValue FROM tbl WHERE Text_GR LIKE '%T%'
        UNION
    SELECT ID, 'Text_EN' FieldName, Text_EN FieldValue FROM tbl WHERE Text_EN LIKE '%T%'
        UNION
    SELECT ID, 'Text_FR' FieldName, Text_FR FieldValue FROM tbl WHERE Text_FR LIKE '%T%'
    ) X

    Δεν παίζει ρόλο όμως, ο query optimizer τιμά το όνομά του... Παράγεται το ίδιο execution plan και στις δύο περιπτώσεις Smile


    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems