דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מניפולציות על שדות מחושבים ב - SQL

מניפולציות על שדות מחושבים ב - SQL

מתוזמן נעוץ נעול הועבר תכנות
15 פוסטים 4 כותבים 364 צפיות 2 עוקבים
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
תגובה
  • תגובה כנושא
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • dovidD dovid

    כלל גדול בSQL, הכתיבה היפה שלו נועדה להסביר ברור מה יהיה הפלט ולא איך ליצור את הפלט.
    ומה האופן בו הוא נוצר בפועל? באופן בו המחשב מחליט שזו הדרך הכי טובה ל"איך ליצור כזה פלט".

    השאלה שוגה בדיוק בזה (וכנראה לזה כיונת @yossiz בלינק, אם כי זה מסוכן כי סיכויים גבוהים שהשואל יפנה לפתרונות ה"מצויינים" שיש שמה שלקחו את השאלה כחידה חסרת תכלית. אני אפילו חושד אותך שאתה כמותם לקחת את השאלה ככה "איך לחסוך כתיבה כפולה").

    הסיבה שאי אפשר לגשת לשדה מחושב בSELECT אין לה שום קשר לעובדה שהWHERE מתאר שלב קודם לשלב הSELECT. השאילתה אינה רצה כפי שהיא כתובה אלא לפי איך שהשרת בוחר לנתח אותה, ולא היה שום מניעה מצד מפתחי השפה לאפשר הפניה בWHERE לשדה שהוכרז בSELECT.
    אולי הם העדיפו שלא כי זה סותר את הפרנציפ, אבל זה בהחלט אפשרי ואמנם בMYSQL וגם באקסס זה אפשרי.
    (אגב זה לא רק בWHERE אלא גם בGROUPBY שודאי רצה אחרי הSELECT ושמה אין לי שום תירוץ למה השפה לא ראו לאפשר שימוש בכינויים שהוגדרו בSELECT).

    ומה התשובה על השאלה? אין שאלה בכלל. כי בשלמא לפי ההנחה השגויה, אז עולה צורך ברור לפתרון כי ישנה בעיה שמחשבים את השדה פעמיים. אולם מכיון שההנחה לא נכונה, והSQL לא יחשב פעמיים את השדה, אז רוב השאלה יורדת כי מה אכפת לך לכתוב פעמיים שדה מחושב? ואם זה בגלל טרחת הכתיבה הכפולה, התשובה היא שאין מה לעשות ואפשר לרתום לעניין את צמד המקשים הכי שימושיים הלא הם הCtrl+C, V.

    M מנותק
    M מנותק
    mekev
    כתב ב נערך לאחרונה על ידי mekev
    #4

    @dovid
    יסוד השאלה הינו לא 'איך למנוע כתיבה כפולה'

    אלא איך להימנע מתוצאה שגויה בשאילתות מורכבות על 'ביג דאטה'
    ולכתוב אותם בצורה נקייה

    שבעתיד כשמישהו יצטרך לערוך ולתקן אותם
    ה'מופע' יהיה ברור ובמקום אחד
    (מספיק שבשגגה אכתוב/אעתיק במקום אחד 2+3/5, ובמקום השני 5/(2+3))
    ואשרוף זמן להבין מדוע התוצאה לא נכונה

    נזכרתי כעת שראיתי פעם בהדרכה של שחר גבירץ
    אפשרות להכניס למשתנים בראש השאילתה, ובהמשך לגשת אליהם
    אעבור על זה שוב לעומק
    ואעדכן

    dovidD 2 תגובות תגובה אחרונה
    2
    • dovidD dovid

      כלל גדול בSQL, הכתיבה היפה שלו נועדה להסביר ברור מה יהיה הפלט ולא איך ליצור את הפלט.
      ומה האופן בו הוא נוצר בפועל? באופן בו המחשב מחליט שזו הדרך הכי טובה ל"איך ליצור כזה פלט".

      השאלה שוגה בדיוק בזה (וכנראה לזה כיונת @yossiz בלינק, אם כי זה מסוכן כי סיכויים גבוהים שהשואל יפנה לפתרונות ה"מצויינים" שיש שמה שלקחו את השאלה כחידה חסרת תכלית. אני אפילו חושד אותך שאתה כמותם לקחת את השאלה ככה "איך לחסוך כתיבה כפולה").

      הסיבה שאי אפשר לגשת לשדה מחושב בSELECT אין לה שום קשר לעובדה שהWHERE מתאר שלב קודם לשלב הSELECT. השאילתה אינה רצה כפי שהיא כתובה אלא לפי איך שהשרת בוחר לנתח אותה, ולא היה שום מניעה מצד מפתחי השפה לאפשר הפניה בWHERE לשדה שהוכרז בSELECT.
      אולי הם העדיפו שלא כי זה סותר את הפרנציפ, אבל זה בהחלט אפשרי ואמנם בMYSQL וגם באקסס זה אפשרי.
      (אגב זה לא רק בWHERE אלא גם בGROUPBY שודאי רצה אחרי הSELECT ושמה אין לי שום תירוץ למה השפה לא ראו לאפשר שימוש בכינויים שהוגדרו בSELECT).

      ומה התשובה על השאלה? אין שאלה בכלל. כי בשלמא לפי ההנחה השגויה, אז עולה צורך ברור לפתרון כי ישנה בעיה שמחשבים את השדה פעמיים. אולם מכיון שההנחה לא נכונה, והSQL לא יחשב פעמיים את השדה, אז רוב השאלה יורדת כי מה אכפת לך לכתוב פעמיים שדה מחושב? ואם זה בגלל טרחת הכתיבה הכפולה, התשובה היא שאין מה לעשות ואפשר לרתום לעניין את צמד המקשים הכי שימושיים הלא הם הCtrl+C, V.

      yossizY מנותק
      yossizY מנותק
      yossiz
      כתב ב נערך לאחרונה על ידי yossiz
      #5

      @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

      וכנראה לזה כיונת @yossiz בלינק, אם כי זה מסוכן כי סיכויים גבוהים שהשואל יפנה לפתרונות ה"מצויינים" שיש שמה שלקחו את השאלה כחידה חסרת תכלית. אני אפילו חושד אותך שאתה כמותם לקחת את השאלה ככה "איך לחסוך כתיבה כפולה"

      לא התכוונתי באמת לשום דבר בלינק שלי חוץ מזה שזו אותה שאלה.
      התלבטתי עם זה מספיק יפה להביא רק לינק לסטאק, אבל תכלס לא היה לי תשובה חכמה לענות (וגם לא התעמקתי מספיק בתשובות שם בסטאק) אז לא מנעתי את עצמי מלציין.
      לא חשבתי לרגע שהשאלה קשורה לביצועים, היה ברור לי שמדובר במניעת כתיבה כפולה אי משום נוחות כתיבה אי משום DRY אי משום קריאות. (כמתכנתים אנחנו מאוד רגישים לבעיה של כפילות מיותרת...)

      @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

      בGROUPBY שודאי רצה אחרי הSELECT

      הממ... הכותב כאן חולק עליך... 😉
      כמובן, שוב, מדובר בסדר לוגי ולא בסדר מעשי

      📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

      dovidD תגובה 1 תגובה אחרונה
      3
      • yossizY yossiz

        @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

        וכנראה לזה כיונת @yossiz בלינק, אם כי זה מסוכן כי סיכויים גבוהים שהשואל יפנה לפתרונות ה"מצויינים" שיש שמה שלקחו את השאלה כחידה חסרת תכלית. אני אפילו חושד אותך שאתה כמותם לקחת את השאלה ככה "איך לחסוך כתיבה כפולה"

        לא התכוונתי באמת לשום דבר בלינק שלי חוץ מזה שזו אותה שאלה.
        התלבטתי עם זה מספיק יפה להביא רק לינק לסטאק, אבל תכלס לא היה לי תשובה חכמה לענות (וגם לא התעמקתי מספיק בתשובות שם בסטאק) אז לא מנעתי את עצמי מלציין.
        לא חשבתי לרגע שהשאלה קשורה לביצועים, היה ברור לי שמדובר במניעת כתיבה כפולה אי משום נוחות כתיבה אי משום DRY אי משום קריאות. (כמתכנתים אנחנו מאוד רגישים לבעיה של כפילות מיותרת...)

        @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

        בGROUPBY שודאי רצה אחרי הSELECT

        הממ... הכותב כאן חולק עליך... 😉
        כמובן, שוב, מדובר בסדר לוגי ולא בסדר מעשי

        dovidD מנותק
        dovidD מנותק
        dovid
        ניהול
        כתב ב נערך לאחרונה על ידי
        #6

        @yossiz סליחה על החשד..

        @yossiz אמר במניפולציות על שדות מחושבים ב - SQL:

        הממ... הכותב כאן חולק עליך... 😉
        כמובן, שוב, מדובר בסדר לוגי ולא בסדר מעשי

        הכותב שמה צודק בבירור, ואני טעיתי (התחלף לי בראש מהWHERE שהוא רץ קודם אך בו אין את השאלה). בכל אופן המקום בו אני ממש סובל מהMSSQL זה בGROUPBY.

        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
        תגובה 1 תגובה אחרונה
        1
        • M mekev

          @dovid
          יסוד השאלה הינו לא 'איך למנוע כתיבה כפולה'

          אלא איך להימנע מתוצאה שגויה בשאילתות מורכבות על 'ביג דאטה'
          ולכתוב אותם בצורה נקייה

          שבעתיד כשמישהו יצטרך לערוך ולתקן אותם
          ה'מופע' יהיה ברור ובמקום אחד
          (מספיק שבשגגה אכתוב/אעתיק במקום אחד 2+3/5, ובמקום השני 5/(2+3))
          ואשרוף זמן להבין מדוע התוצאה לא נכונה

          נזכרתי כעת שראיתי פעם בהדרכה של שחר גבירץ
          אפשרות להכניס למשתנים בראש השאילתה, ובהמשך לגשת אליהם
          אעבור על זה שוב לעומק
          ואעדכן

          dovidD מנותק
          dovidD מנותק
          dovid
          ניהול
          כתב ב נערך לאחרונה על ידי
          #7

          @mekev הדרך הנקיה והנכונה היא לכתוב כפול, זה ה"לפי הספר".
          בשביל שיהיה מקום אחד לערוך ולא יהיו טעויות צריך לפתח שפה חדשה...
          המון הצלחה!

          • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
          • בכל נושא אפשר ליצור קשר dovid@tchumim.com
          חגיח תגובה 1 תגובה אחרונה
          2
          • dovidD dovid

            @mekev הדרך הנקיה והנכונה היא לכתוב כפול, זה ה"לפי הספר".
            בשביל שיהיה מקום אחד לערוך ולא יהיו טעויות צריך לפתח שפה חדשה...
            המון הצלחה!

            חגיח מנותק
            חגיח מנותק
            חגי
            כתב ב נערך לאחרונה על ידי
            #8

            @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

            בשביל שיהיה מקום אחד לערוך ולא יהיו טעויות צריך לפתח שפה חדשה...

            https://github.com/prql/prql

            dovidD תגובה 1 תגובה אחרונה
            5
            • חגיח חגי

              @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

              בשביל שיהיה מקום אחד לערוך ולא יהיו טעויות צריך לפתח שפה חדשה...

              https://github.com/prql/prql

              dovidD מנותק
              dovidD מנותק
              dovid
              ניהול
              כתב ב נערך לאחרונה על ידי
              #9

              @חגי קישור מדהים!
              אבל בקשר לבעיה הזאת שים לב שבאקסס + MYSQL ועוד, אין אותה (את הבעיות האחרות יש).

              • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
              • בכל נושא אפשר ליצור קשר dovid@tchumim.com
              תגובה 1 תגובה אחרונה
              1
              • M mekev

                @dovid
                יסוד השאלה הינו לא 'איך למנוע כתיבה כפולה'

                אלא איך להימנע מתוצאה שגויה בשאילתות מורכבות על 'ביג דאטה'
                ולכתוב אותם בצורה נקייה

                שבעתיד כשמישהו יצטרך לערוך ולתקן אותם
                ה'מופע' יהיה ברור ובמקום אחד
                (מספיק שבשגגה אכתוב/אעתיק במקום אחד 2+3/5, ובמקום השני 5/(2+3))
                ואשרוף זמן להבין מדוע התוצאה לא נכונה

                נזכרתי כעת שראיתי פעם בהדרכה של שחר גבירץ
                אפשרות להכניס למשתנים בראש השאילתה, ובהמשך לגשת אליהם
                אעבור על זה שוב לעומק
                ואעדכן

                dovidD מנותק
                dovidD מנותק
                dovid
                ניהול
                כתב ב נערך לאחרונה על ידי
                #10

                @mekev הבטחת לעדכן.
                מסקרן אותי בעיקר מה עשית.

                • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                M תגובה 1 תגובה אחרונה
                0
                • dovidD dovid

                  @mekev הבטחת לעדכן.
                  מסקרן אותי בעיקר מה עשית.

                  M מנותק
                  M מנותק
                  mekev
                  כתב ב נערך לאחרונה על ידי mekev
                  #11

                  @dovid

                  השתמשתי ב Common Table Expressions (CTE)

                  דוגמא:

                  with cte as (
                  select id as 'מזהה' ,price as 'סכום עסקה' ,paid as 'שולם' , 'יתרת תשלום' = price-paid , 'יתרה כולל מעמ' = (price-paid)*1.17
                  from Sales)
                  
                  select *
                  from cte
                  where [יתרה כולל מעמ] >50
                  
                  dovidD תגובה 1 תגובה אחרונה
                  0
                  • M mekev

                    @dovid

                    השתמשתי ב Common Table Expressions (CTE)

                    דוגמא:

                    with cte as (
                    select id as 'מזהה' ,price as 'סכום עסקה' ,paid as 'שולם' , 'יתרת תשלום' = price-paid , 'יתרה כולל מעמ' = (price-paid)*1.17
                    from Sales)
                    
                    select *
                    from cte
                    where [יתרה כולל מעמ] >50
                    
                    dovidD מנותק
                    dovidD מנותק
                    dovid
                    ניהול
                    כתב ב נערך לאחרונה על ידי
                    #12

                    @mekev שיערתי לעצמי.
                    תודה על העדכון.
                    המשמעות של זה עבורי שלהבא בשאלות שלך עלי להתמקד רק בלענות על מה ששאלת, ולא לייעץ לך מה אני חושב.

                    • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                    • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                    M תגובה 1 תגובה אחרונה
                    0
                    • dovidD dovid

                      @mekev שיערתי לעצמי.
                      תודה על העדכון.
                      המשמעות של זה עבורי שלהבא בשאלות שלך עלי להתמקד רק בלענות על מה ששאלת, ולא לייעץ לך מה אני חושב.

                      M מנותק
                      M מנותק
                      mekev
                      כתב ב נערך לאחרונה על ידי
                      #13

                      @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

                      המשמעות של זה עבורי שלהבא בשאלות שלך עלי להתמקד רק בלענות על מה ששאלת, ולא לייעץ לך מה אני חושב

                      ממש לא...

                      דווקא התשובות המפורטות שלך
                      עוזרות לי להבין הרבה מעבר לשאלה הנקודתית
                      ומייעלת עבורי (ועבור שאר המשתמשים) ה-מ-ו-ן

                      אתה בדר"כ מביא רקע על התהליך, ומה אמור להיות הסינטקס (זה המילה?) מאחוריה

                      בזכות זה אני מצליח אח"כ לבצע חיפוש ולימוד עצמי המתבססות על הידע שלמדת אותנו פה
                      (גם לדעת מה לחפש זה מאוד חשוב)

                      אז
                      אשמח מאוד אם תמשיך להרחיב כמה שניתן בתשובה נקודתית
                      ובעיקר הרחבת הידע על האפשריות הנוספות האפשריות
                      (להתייעץ - זה לשמוע דעה שטרם חשבת עליה)

                      dovidD תגובה 1 תגובה אחרונה
                      4
                      • M mekev

                        @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

                        המשמעות של זה עבורי שלהבא בשאלות שלך עלי להתמקד רק בלענות על מה ששאלת, ולא לייעץ לך מה אני חושב

                        ממש לא...

                        דווקא התשובות המפורטות שלך
                        עוזרות לי להבין הרבה מעבר לשאלה הנקודתית
                        ומייעלת עבורי (ועבור שאר המשתמשים) ה-מ-ו-ן

                        אתה בדר"כ מביא רקע על התהליך, ומה אמור להיות הסינטקס (זה המילה?) מאחוריה

                        בזכות זה אני מצליח אח"כ לבצע חיפוש ולימוד עצמי המתבססות על הידע שלמדת אותנו פה
                        (גם לדעת מה לחפש זה מאוד חשוב)

                        אז
                        אשמח מאוד אם תמשיך להרחיב כמה שניתן בתשובה נקודתית
                        ובעיקר הרחבת הידע על האפשריות הנוספות האפשריות
                        (להתייעץ - זה לשמוע דעה שטרם חשבת עליה)

                        dovidD מנותק
                        dovidD מנותק
                        dovid
                        ניהול
                        כתב ב נערך לאחרונה על ידי
                        #14

                        @mekev תודה, אחרי כאלה מחמאות קשה לי להטיח בך ביקורת שהינך שבוי בתפיסה שאיתה שאלת.
                        אתה עדיין חושב שחזרה על ביטוי הן בSELECT והן בWHERE היא סרבול אישי שנזדמן לפתחך ואתה שמח להיפטר ממנו, אם היית מבין שככה אמורים לכתוב לא נראה ששיקול התחזקוה היה מדרבן אותך להסתבך עם תחבירים.

                        אגב הCTE מיותר פה, אתה מייצר שאילתה על שאילתה, זה תת שאילתה קלאסית:

                         select * from (
                             select id as 'מזהה' ,
                             price as 'סכום עסקה' ,
                            paid as 'שולם' ,
                            'יתרת תשלום' = price-paid ,
                            'יתרה כולל מעמ' = (price-paid)*1.17 from Sales
                        )
                        where [יתרה כולל מעמ] >50
                        

                        CTE דרוש רק כאשר אתה משתמש עם התוצאות יותר מפעם אחת (נניח בשתי שאילתות או רקרוסיבית)

                        • מנטור אישי בתכנות והמסתעף – להתקדם לשלב הבא!
                        • בכל נושא אפשר ליצור קשר dovid@tchumim.com
                        M תגובה 1 תגובה אחרונה
                        3
                        • dovidD dovid

                          @mekev תודה, אחרי כאלה מחמאות קשה לי להטיח בך ביקורת שהינך שבוי בתפיסה שאיתה שאלת.
                          אתה עדיין חושב שחזרה על ביטוי הן בSELECT והן בWHERE היא סרבול אישי שנזדמן לפתחך ואתה שמח להיפטר ממנו, אם היית מבין שככה אמורים לכתוב לא נראה ששיקול התחזקוה היה מדרבן אותך להסתבך עם תחבירים.

                          אגב הCTE מיותר פה, אתה מייצר שאילתה על שאילתה, זה תת שאילתה קלאסית:

                           select * from (
                               select id as 'מזהה' ,
                               price as 'סכום עסקה' ,
                              paid as 'שולם' ,
                              'יתרת תשלום' = price-paid ,
                              'יתרה כולל מעמ' = (price-paid)*1.17 from Sales
                          )
                          where [יתרה כולל מעמ] >50
                          

                          CTE דרוש רק כאשר אתה משתמש עם התוצאות יותר מפעם אחת (נניח בשתי שאילתות או רקרוסיבית)

                          M מנותק
                          M מנותק
                          mekev
                          כתב ב נערך לאחרונה על ידי
                          #15

                          @dovid אמר במניפולציות על שדות מחושבים ב - SQL:

                          אגב הCTE מיותר פה, אתה מייצר שאילתה על שאילתה, זה תת שאילתה קלאסית:

                          אכן,
                          צודק
                          זה רק היה דוגמא להבהרת נקודת השאלה (איך לגשת לעמודה מחושבת בגוף הselect ואיך בwhere )

                          (השאילתא המקורית אצלי מורכבת
                          [מכילה GROUP BY, ולא הסתדרתי עם הHAVING לפילטור הרצוי]
                          ומכילה מידע שאינו אפשרי לפרסום פה)

                          תגובה 1 תגובה אחרונה
                          1
                          • dovidD dovid העביר נושא זה מ-תכנות ב-
                          תגובה
                          • תגובה כנושא
                          התחברו כדי לפרסם תגובה
                          • מהישן לחדש
                          • מהחדש לישן
                          • הכי הרבה הצבעות


                          בא תתחבר לדף היומי!
                          • התחברות

                          • אין לך חשבון עדיין? הרשמה

                          • התחברו או הירשמו כדי לחפש.
                          • פוסט ראשון
                            פוסט אחרון
                          0
                          • דף הבית
                          • קטגוריות
                          • פוסטים אחרונים
                          • משתמשים
                          • חיפוש
                          • חוקי הפורום