Oracle Master Bronze のSQLを勉強中なのですが、一重引用符について「文字リテラルと日付リテラルは列名と区別できないから一重引用符で囲む」とありました。
列名と同じ値が使われていなければ一重引用符で囲まなくても区別出来るのでは、と疑問に思ったのですが、調べても解説しているページを見つけられませんでした。
どなたかお分かりになる方いらっしゃいますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
端的に言えば、「そういう文法に決まっているから」という、つまらない回答となります。とりわけ、日付リテラルは2018-11-02
のような形になるので、引用符など何かしらの区別をつけないと引き算と区別が付きません。
SQLではないのですが、PHPでは「名前だけ書くと(ほかで定義されていない場合)自動的にその名前の定数として解釈する」という仕様がありましたが、「間違えて書いた名前が意図せず有効になってしまう」など弊害も多かったので、PHP 7.2で非推奨に切り替えられました。…というように、「自動で文字列として認識する」というのは、むしろよくない機能だと考えられています。
投稿2018/11/01 23:41
総合スコア145183
0
なんでも許してたら文法エラーが検出できないじゃないですか。
投稿2018/11/01 23:33
総合スコア28660
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/02 09:20
0
ユーザー視点での解説は他の方が記載されているので、少し別の視点の説明を記載します。
自分が「データベースの中の人(膨大なデータの中から、SQLで指示されたデータを探し出してくる係)」になったつもりで考えていただきたいのですが、「文字リテラルかどうか」の判定、どちらが楽だと思いますか?
1:一重引用符で囲ってあるもの
2:テーブル名やカラム名や予約語等々と重複しないもの
「2」を判定するには、全てのテーブル名やカラム名等々と合致していないか、を毎回調べなくてはならないので、おそらく「1」のほうが楽、となるのではないでしょうか?
実際には、データベースには中の人はいませんが、プログラムがやっている内部処理を考えると「こうだったら文字リテラル」という判定の条件が明確なほうが、処理効率が良くなるのです。
余談ですが、数字は一重引用符で囲わなくて良い、となっています。
これは、テーブル名やカラム名等々のルールとして「一文字目が数字ではないこと」というものが定義されているからです。
また、囲ってしまうと、今度は文字や日付と区別がつかなくなる、というのもあるかもしれません。
投稿2018/11/02 00:06
総合スコア696
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/04 22:47
0
型を軽視しすぎじゃないですかね。
文字列リテラルを表明する記号がないということは、文字列カラムに日付っぽいデータや数値っぽいデータは入れられなくなる、ということになりませんか?
具体的に、欲しいものメモというテーブルを作ろうとして、型番というカラムをvarchar(text)で用意したときに(型番なんてどこのメーカーがどういう番号を付けるか分からないので文字にした)、数値様の型番1001や日付様の型番1779-01-01をどう判断するのでしょうか?数値様文字の+-10や日付様型番02000-12-31は?パースエラー?型が合わないからエラー?
何でも文字にはキャストできるようにするのですか?NULLも文字にはキャストしますか?あるいは何でもキャストするなら(insert into valuesの構文で)カラム間違いを防げないってことですよね?
(実装上は数値リテラルは文字になりそうな気もしますが、+10が数値リテラルと解釈されて10になってから文字になるか+10がそのまま文字と認識されるかで格納値が違ってきます)
クオートは型を宣言しているのだと思います。その説明は、それを分かり易く言おうとしているのだと思います。
投稿2018/11/02 01:04
総合スコア12705
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/05 23:06
0
空白を含む文字列を考えたら一目瞭然ですな。
どこからどこまでが文字列リテラルなのか判別できないです。
投稿2018/11/02 00:19
総合スコア16998
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/01 23:49