Autor Téma: SQL asi chyba pro dnešní den  (Přečteno 924 krát)

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2084
  • Karma: 91
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
SQL asi chyba pro dnešní den
« kdy: 19-01-2018, 14:55:50 »
Náhodou se mi podařilo vytvořit zajímavou konstrukci, takže pro zajímavost

Kód: [Vybrat]
select top 10 + ' some ' + dcNumber, 'xx' +++++++++ ' some '+dcNumber from tTest

nebo
select top 10 + ' - '+ dcNumber, +++++++++ ' - '+dcNumber from tTest


kde dcNumber je nejaky VARCHAR sloupec z tabulky tTest, coz ve výsledku projde a vrátí to 10 záznamů , kde to před + (nebo mezi +) bere asi jako nula mezer (ale ne NULL)

Nebo je to definované chování?



Embarcadero MVP - Czech republic

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQL asi chyba pro dnešní den
« Odpověď #1 kdy: 19-01-2018, 15:22:01 »
Nikde se o vicenasobnem spojovacim + operatoru nepise (zdroj), ale do stavu NULL se zda se nevyhodnoti (alespon ve verzi kterou mam). Staci kratky test, kdyz povolis CONCAT_NULL_YIELDS_NULL, pak by multiple + operator ktery by evaluoval do stavu NULL vratil ve vysledku NULL, coz se mi na Microsoft SQL Server Express 12.0.2000.8 v nasledujicim prikazu spustenem v Management Studiu nepodarilo:

Kód: MySQL [Vybrat]
  1. SET CONCAT_NULL_YIELDS_NULL ON;  
  2. GO
  3. SELECT 'Concatenate' +++++++ ' me'; -- if multiple consequent + operators here evaluated to NULL, this would return NULL
  4. GO

Tipoval bych ze tech vicero spojovacich + operatoru parser prikazu proste zahodi (ignoruje). A asi tomu tak je i v pripade aritmetickeho + operatoru (ostatni multiplikovane aritmeticke operatory mi parser prikazu nepovolil; navic by napr. vicenasobny - znamenal komentar), podarilo se mi spustit i:

Kód: MySQL [Vybrat]
  1. SELECT 1 +++++++ 1; -- huh?
« Poslední změna: 19-01-2018, 15:40:56 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2084
  • Karma: 91
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:SQL asi chyba pro dnešní den
« Odpověď #2 kdy: 19-01-2018, 15:41:17 »
Jo to jsem psal, ze to neni NULL.

mne pobavilo i to
Kód: [Vybrat]
SELECT top 10 + ' - '+ dcNumber ....

tj. 10 + ' - ', ale ve skutecnosti vezme top 10 a pak zbytek je pak + ' - ' + sloupec, coz byl zacatek jak jsem na to prisel
Embarcadero MVP - Czech republic

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQL asi chyba pro dnešní den
« Odpověď #3 kdy: 19-01-2018, 15:45:52 »
Jo to jsem psal, ze to neni NULL.

mne pobavilo i to
Kód: [Vybrat]
SELECT top 10 + ' - '+ dcNumber ....

tj. 10 + ' - ', ale ve skutecnosti vezme top 10 a pak zbytek je pak + ' - ' + sloupec, coz byl zacatek jak jsem na to prisel

Tomu nerozumim. Resultset je u me v poradku. Je ten TOP relevantni? Nemas na mysli jen:

Kód: MySQL [Vybrat]
  1. SELECT +++++++ 'I am a string concatenated with what?';
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Radek Červinka

  • Administrátoři
  • Padawan
  • *****
  • Příspěvků: 2084
  • Karma: 91
    • Verze Delphi: D5,D2007, DXE, DXE2 + 2 poslední (Tokyo)
    • O Delphi v češtině
Re:SQL asi chyba pro dnešní den
« Odpověď #4 kdy: 19-01-2018, 15:52:25 »
Jo to jsem psal, ze to neni NULL.

mne pobavilo i to
Kód: [Vybrat]
SELECT top 10 + ' - '+ dcNumber ....

tj. 10 + ' - ', ale ve skutecnosti vezme top 10 a pak zbytek je pak + ' - ' + sloupec, coz byl zacatek jak jsem na to prisel

Tomu nerozumim. Resultset je u me v poradku. Je ten TOP relevantni? Nemas na mysli jen:

Mejme tabulku treba se 100 radky, ten TOP 10 vrati jen 10 zaznamu, ale ten zapis
SELECT top 10 + ' - '+ dcNumber mne svadi k tomu, abych to precetl jako 10 + ' - ' + obsah sloupce. Myslel jsme ze to parser vyhodi jako chybu, ale on ne,
on si odrizene SELECT TOP 10 a pak zbytek vyhodnoti s plusem na zacatku.
Embarcadero MVP - Czech republic

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQL asi chyba pro dnešní den
« Odpověď #5 kdy: 19-01-2018, 16:03:30 »
Mejme tabulku treba se 100 radky, ten TOP 10 vrati jen 10 zaznamu, ale ten zapis
SELECT top 10 + ' - '+ dcNumber mne svadi k tomu, abych to precetl jako 10 + ' - ' + obsah sloupce. Myslel jsme ze to parser vyhodi jako chybu, ale on ne,
on si odrizene SELECT TOP 10 a pak zbytek vyhodnoti s plusem na zacatku.

Takze Te v podstate trapi zapis:

Kód: MySQL [Vybrat]
  1. SELECT TOP 1+1;

Ktery parser chape jako prenes prvnich 1 zaznamu s konstantni hodnotou 1, kde ten + operator nema "levy operand". To me taky :)
« Poslední změna: 19-01-2018, 16:13:52 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Delfin

  • Guru
  • *****
  • Příspěvků: 1281
  • Karma: 56
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:SQL asi chyba pro dnešní den
« Odpověď #6 kdy: 19-01-2018, 21:29:56 »
Jen stranou, standard SQL:2008 popisuje spojovaci string operator || (+ je vymysl tvurcu kteri jej neresi). Byt SQL Server tento standard neresi, co me mrzi je ze muj favorit PostgreSQL zklamal v parsovani vicenasobneho aritmetickeho + operatoru :( Je tedy mozne na nem spustit:

Kód: MySQL [Vybrat]
  1. SELECT 1 +++++++ 1; -- huh?

Se zbytkem by vas poslal parser tam kam slunce nezasviti (kvuli jinemu spojovacimu string operatoru).
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

 

S rychlou odpovědí můžete používat BB kódy a emotikony jako v běžném okně pro odpověď, ale daleko rychleji.

Upozornění: do tohoto tématu bylo naposledy přispěno před 120 dny.
Zvažte prosím založení nového tématu.

Jméno: E-mail:
Ověření:
Kolik je šest plus čtyři (slovem):