第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

MS SQL CONCAT 與“+”查詢的區(qū)別(使用 Doctrine 2)

MS SQL CONCAT 與“+”查詢的區(qū)別(使用 Doctrine 2)

PHP
湖上湖 2022-06-11 18:03:27
我正在使用 Doctrine 2 接口訪問 MS SQL 數據庫。我發(fā)現雙方都非常有趣的問題:Doctrine 2 和 MS SQL。Doctrine 2 出于某種原因更改查詢$this->getEntityManager()->createQueryBuilder()            ->from(table::class, 'il')            ->select('CONCAT(il.col1,il.col2,il.col3) AS concated')更改為類似(它使用自己的別名):SELECT (t0_.col1+ t0_.col2+ t0_.col3) AS sclr_0 FROM tableName t0_最重要的 - 它CONCAT用“+”改變了 into 表達式。但它工作正常(或者看起來確實如此),直到我想將連接字符串與其他表中的值進行比較......$targetQueryBuilder->getEntityManager()->createQueryBuilder()            ->from($namespace, 's')            ->select('1')            ->where('CONCAT(il1.col1, il1.col2, il1.col3) = s.controlValue')            ->andWhere('s.tableName = :tablename')            ->andWhere('s.tableRowIdentifier='.$rowIdentifier);(我正在從內存中編寫此查詢,如果有問題 - 沒關系 - 這是為了將問題可視化)在 SQL Studio 中執(zhí)行原始查詢對CONCAT函數來說非常有效。使用“+”則不然。所有具有 nvarchar 類型的連接列。問題是:差異在哪里?我檢查了學說中的大量組合以跳過映射CONCAT到“+”但沒有成功,我不得不編寫一些虛擬詞法分析器擴展來強制將CONCAT函數應用于最終查詢。其他(可能是特定于 ms sql server)的問題是:當我在測試時SELECT(i1_.NameUnternehmen + i1_.Land + i1_.Ort + i1_.Stra?e + i1_.Postleitzahl) AS a,CONCAT(i1_.NameUnternehmen , i1_.Land , i1_.Ort , i1_.Stra?e , i1_.Postleitzahl) AS cFROM tablename(Stra?e在這個問題中,列名看起來并不重要)當使用 WHERE 語句將連接字符串與控制值進行比較時,選擇結果是不同的。->where('CONCAT(il1.col1, il1.col2, il1.col3) = s.controlValue')- 一切都是正確的->where('(il1.col1 + il1.col2 + il1.col3) = s.controlValue')- 列“a”中的結果為空。我剛剛測試過,在其他表上它有時不為空。我不知道為什么。“c”列總是正確的。
查看完整描述

1 回答

?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

CONCAT并且+不要操作相同。如果任何表達式NULL在使用時具有值+,NULL則將返回。對于CONCAT,它將隱式替換NULL為'',因此NULL不會返回。


CONCAT還會將表達式中的任何值隱式轉換為(n)varchar,其中 as+使用數據類型優(yōu)先級來確定數據類型,并將表達式中的其他值隱式轉換為最高優(yōu)先級的數據類型。


例子:


SELECT c1,

       c2,

       c3,

       c4,

       c1 + c2 + c3 + c4, --NULL 

       CONCAT(c1, c2, c3, c4) --'abcdefxyc'

FROM (VALUES('abc','def',NULL,'xyz'))V(c1, c2, c3, c4);

隱式轉換:


SELECT c1 + c2 + c3 + c4

FROM (VALUES('abc','def',7,'xyz'))V(c1, c2, c3, c4);

消息 245,級別 16,狀態(tài) 1,第 9

行將 varchar 值“abcdef”轉換為數據類型 int 時轉換失敗。


SELECT CONCAT(c1, c2, c3, c4) --'abcdef7xyz'

FROM (VALUES('abc','def',7,'xyz'))V(c1, c2, c3, c4);

有趣但預期的行為:


SELECT c1 + c2 + c3 + c4 --NULL

FROM (VALUES('abc','def',NULL,7))V(c1, c2, c3, c4);


SELECT c1 + c2 + c3 + c4 --123456790

FROM (VALUES('123','456','789',1))V(c1, c2, c3, c4);

這種行為的原因是因為表達式是從左到右計算的。對于第一個,因此您有'abc' + 'def' = 'abcdef'( 'abcdef' + NULL = NULL) varchar。最后你有了NULL + 7 = NULL,這很好,NULL可以隱式轉換為int.


對于后者,你有'123' + '456' = '123456'then '123456' + '789' = '123456789'。最后你有'123456789' + 1 = 123456789 + 1 = 123456790. 請注意,在最終表達式中,varchar首先隱式轉換為 a int,然后+運算符充當加法,而不是串聯。


查看完整回答
反對 回復 2022-06-11
  • 1 回答
  • 0 關注
  • 128 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號