[英]Does 1 always equal '1' in SQL?
我試圖確定用於將數字與相同數字的字符或字符串版本進行比較的標准SQL行為。 SELECT 1 = '1'
(或類似)是否總是返回某種“真實”值( true
, 1
, '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
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.