簡體   English   中英

SQL中1總是等於'1'嗎?

[英]Does 1 always equal '1' in SQL?

我試圖確定用於將數字與相同數字的字符或字符串版本進行比較的標准SQL行為。 SELECT 1 = '1' (或類似)是否總是返回某種“真實”值( true1't'等)? 我已經在PostgreSQL和MySQL上做了很多確認,但我找不到整個SQL的資源。

更新:問題的目的是我試圖弄清楚在選擇/插入/更新/等時使用不帶引號的數字是否有效。 來自非數字字段,其值為數字。

SELECT 1='1'給出TRUE因為在我知道的所有實現中, '1'INT的正確構造函數。

但是SQL使用嚴格的輸入,看到:

# SELECT 1=CAST('1' AS TEXT);
ERROR:  operator does not exist: integer = text
LINE 1: SELECT 1=CAST('1' AS TEXT);
                ^
HINT:  No operator matches the given name and argument type(s). You might need to add  explicit type casts.

關於標准(SQL 92,99和2003),它似乎是錯誤的:

     <literal> ::=
            <signed numeric literal>
          | <general literal>

     <general literal> ::=
            <character string literal>
          | <national character string literal>
          | <bit string literal>
          | <hex string literal>
          | <datetime literal>
          | <interval literal>

     <signed numeric literal> ::=
          [ <sign> ] <unsigned numeric literal>

     <unsigned numeric literal> ::=
            <exact numeric literal>
          | <approximate numeric literal>

     <exact numeric literal> ::=
            <unsigned integer> [ <period> [ <unsigned integer> ] ]
          | <period> <unsigned integer>

     <unsigned integer> ::= <digit>...

     <character string literal> ::=
          [ <introducer><character set specification> ]
          <quote> [ <character representation>... ] <quote>
            [ { <separator>... <quote> [ <character representation>... ] <quote> }... ]

因為<quote>僅包含在<bit string literal><hex string literal> ,...中,但不包含在數字文字中...

SQL Server

if 1 = '1'
print 'yes'
else
print 'no'

輸出:是的

這會被轉換,請參閱此處獲取隱式和顯式轉換可能性的完整列表: CAST和CONVERT(Transact-SQL)

首先,在SQL Server SELECT 1 = '1'無效。 雖然,如果你運行以下代碼,你會發現1做='1'

if (1 = '1') begin
    print 'true'
end else begin
    print 'false'
end

結果:

true

“一般的SQL ”沒有“truthy”值的概念。

MySQLPostgreSQL不同,在OracleSQL Server ,沒有內部數據類型可以用作WHERE子句或WHEN謂詞中的布爾值。

你應該總是在這些子句中使用某種謂詞。

mydata沒有數據類型可用於使這些查詢起作用:

SELECT  1
WHERE   @mydata

要么

SELECT  1
FROM    dual
WHERE   :mydata

此外,沒有SQL標准規定了類型轉換順序。

常量的數據類型可以轉換為列數據類型的數據類型,反之亦然。

這可能導致類似於本問題中描述的問題

1是數字,'1'是某種類型的CHAR數組,它們永遠不應該相等。 如果它們是依賴於實現的行為

從MySQL 5.x和SQL Server 2005進行測試,它們都將'1'隱式轉換為1以使評估返回true。

但這也可能與整理有關。

雖然它似乎在許多實現中有效,但根據SQL標准,不允許比較1 = '1'

問題(給定更新文本)不是:

SELECT 1 = '1'

會工作,但會:

SELECT '1'::text = 1

工作。 這當然是:不。 至少在PostgreSQL上,並且有一個很好的理由。

來自更新:

您的更新聽起來像是要執行以下操作:

SELECT *
FROM MyTable 
WHERE StringColumn = 1

那不管用。 如果該字符串列中的任何值都是非數字的,則只要sql引擎到達該行,就會拋出錯誤。 在MS SQL Server中,錯誤是“ 將varchar值'blah'轉換為數據類型int時轉換失敗。

因此,如果要進行比較,則必須確保比較類似的數據類型。 例如:

SELECT *
FROM MyTable 
WHERE StringColumn = '1'

對於“始終為true”的select語句,只需使用SELECT 1 這將永遠是真的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM